2011-09-21 84 views
3

多個選擇與代表使用與用於執行以下操作:如何使用jQuery對象作爲參數委託方法

$(contextElement).delegate('selector1, selector2' , 'eventName', function(){ //blabla }); 

在管理DOM元素變得至關重要較大的項目,存儲被綁定到變量中的元素窗戶對象成爲一種有吸引力的工作方式。

但是我不能加入與使用的委託方法多選擇這種工作方式:

window.someControl = { 
    contextElement = $('selector0'), 
    DOMasProperty1 = $('selector1'), 
    DOMasProperty2 = $('selector2') 
} 

someControl.contextElement.delegate(
'you magic answer for using DOMasProperty1 
and DOMasProperty2', 
'click', 
function(){ 

    //blabla 

}); 

注:我知道選擇爲的字符串值反對它的jQuery對象可以存儲在someControl對象中。然而,我存儲jQuery對象以提高代碼的性能,並且一次又一次地調用字符串值將使這種工作方式與簡單地使用方法的選擇器名稱不同。

我需要一個答案以某種方式使用委託的具有減少DOM結合查找

+1

@Rocket:這有什麼錯一點點幽默? :)參考你的編輯,刪除「Thanks 256k」 – XGreen

回答

2

jQuery的對象都有一個.selector屬性,會參考你原來的選擇。

someControl.contextElement.delegate(
    window.someControl.DOMasProperty1.selector + ',' + 
    window.someControl.DOMasProperty2.selector, 
    'click', 
    function(){ 

      //blabla 

    }); 

注意,它會爲工作:

DOMasProperty1 = $('selector1'), 

...但可能不是如果包括DOM遍歷方法,如:

DOMasProperty1 = $('selector1').parent(), 
+0

謝謝帕特里克dw,我必須評論同樣的事情,就像我爲Sidnicious所做的一樣。它看起來非常好,並感謝我教這個選擇器方法(對未來有用),但這種方式可以使DOM查找再次回到代碼中。我需要他們都是一次又分開。 – XGreen

+1

@XGreen:不,它不會執行更多的DOM查找。但是如果你打算使用'.delegate()',那麼因爲它完全是基於選擇器的事件委託,所以它依賴於一個選擇器在接收事件的上下文中運行元素。你不能用元素或jQuery對象來做到這一點。爲此,您需要將自己的事件委託方法放在一起,以便與元素進行比較。 – user113716

1

我不完全清楚你的問題,但我會做這樣的事情:

window.someControl = { 
    contextElement: $('selector0'), 
    selectors: ['selector1', 'selector2'] 
} 

someControl.contextElement.delegate(someControl.selectors.join(','), 'click', function(){ 
    // … 
}); 

請注意,創建對象JavaScript的語法如下所示:

{ 
    key: value 
} 

這樣的:

{ 
    key = value 
} 
+0

你的回答非常好,但你會發現,將jQuery對象存儲爲屬性值的根本原因是通過jQuery減少了DOM查找的數量。因此,如果我開始只存儲選擇器的字符串值,那麼它就會失敗它爲什麼不能提高性能的目的。 – XGreen

+0

@XGreen:實際上,爲'.delegate()'選擇器創建jQuery對象不會給你任何*性能增益 - 每次'contextElement'內發生'click'時,'.delegate()'測試點擊選擇器(作爲字符串)。它永遠不會使用你預先創建的jQuery對象(除了'contextElement')。 – s4y

+0

我想我可以緩存在一個全球範圍的對象。通過定義一個帶有jQuery結果的全局容器,所以我可以從其他函數中引用它們來減少查找 – XGreen

相關問題