2012-02-01 62 views
0

我有一個類似於this one的問題,但是有一個重要的區別。接受答案中提供的方法適用於「直接」綁定事件。如果處理程序分配了delegate方法,則不會生成結果。例如:通過委託()方法測試事件處理程序是否綁定到jQuery中的元素

$("#some-element").delegate(".some-class", "click", function() { 
    alert("Click!"); 
}); 

經過與some-class類元素被生成並插入到HTML,是有辦法以測試是否click事件處理程序已經被綁定到他們?

編輯:按@尖尖的評論,我會糾正上面的問題,因爲處理程序將不會被綁定到.some-class

有沒有一種方法來檢查,如果一個元素爲代表,例如,通過一個jQuery對象(在這個例子中它可能是$(".some-class")),如果點擊,會觸發處理程序?

+3

「click」事件處理程序不*綁定到這些元素。它被綁定到「#some-element」,並且不會因爲DOM改變而改變。事件傳播到DOM(「bubble」),綁定到「#some-element」的處理程序首先確保事件目標具有類「some-class」。如果是這樣,處理程序被調用。 – Pointy 2012-02-01 14:03:57

+0

我明白了。知道 - 是否有辦法模擬我在問題中提到的行爲?我現在將其更正爲更具體的 – Przemek 2012-02-01 14:13:00

+0

嗯,我不認爲有一個現成的jQuery機制來檢查這一點。我想你可以寫一個,如果你知道jQuery在哪裏/如何存儲「.delegate()」的事件限定符信息。看起來,簡單地保留你自己記錄的處理器設置會更容易。 – Pointy 2012-02-01 14:15:56

回答

1

正如Pointy指出的那樣,事件冒泡起來,並且綁定到根元素的單個「主」事件處理程序會檢查最初接受點擊的元素是否具有您提供的類,如果是,您的回調將會叫做。

所以要檢查你的回調會的元素,所有您需要做的是檢查,如果該元素是由選擇所提供的名單上被稱爲$("#some-element .some-class");

所以這樣的事情應該工作(避風港」噸測試):

var testEl = elementYouWantToTestAgainst; 
if ($("#some-element .some-class").is(testEl)) { 
    //It is "bound" 
} 

或另一種解決方案,它做同樣的事情;

//Which should do something like this: 
var els = $("#some-element .some-class"); 
els.each(function() { 
    if (this === testEl) { 
     //It is "bound" 
    } 
}); 

至於調試事件,我通常只是添加console.log("Event fubar fired!");的處理程序。

+0

\ @Maiku:你可以使用'is()'方法, 'if($(「#some-element .some-class」)。(elementYouWantToTestAgainst))' – Matt 2012-02-01 14:21:07

+0

當我在應用程序中觸發一個'click'事件時出現了一些問題,我需要它來進行調試。感謝您的提示,我會嘗試。 – Przemek 2012-02-01 14:21:26

+0

@Matt,謝謝,我只是瀏覽文檔,看看有沒有這樣的事情。我現在不使用太多的jQuery。 – 2012-02-01 14:23:21

相關問題