2012-02-01 64 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

相关问题