jQuery:同一事件的多个处理程序

如果我将两个事件处理程序绑定到同一个元素的相同事件,会发生什么?

例如:

var elem = $("...") elem.click(...); elem.click(...); 

最后一个处理程序“获胜”,还是将这两个处理程序运行?

这两个处理程序都会运行,jQuery事件模型允许在一个元素上有多个处理程序,因此后面的处理程序不会覆盖旧的处理程序。

处理程序将按照它们绑定的顺序执行 。

假设你有两个处理器fg ,并且要确保它们以已知和固定的顺序被执行,那么就把它们封装起来:

 $("...").click(function(event){ f(event); g(event); }); 

这样(从jQuery的angular度来看)只有一个处理程序,它以指定的顺序调用fg

jQuery的.bind()以绑定顺序触发

当一个事件到达一个元素时,绑定到该元素的所有事件types的处理程序被触发。 如果有多个处理程序注册,它们将始终按照它们绑定的顺序执行。 所有处理程序执行完后,事件将继续沿着正常的事件传播path。

资料来源: http : //api.jquery.com/bind/

因为jQuery的其他function(例如.click() )是.bind('click', handler)快捷方式,所以我猜测它们也是以它们绑定的顺序触发的。

您应该可以使用链接按顺序执行事件,例如:

 $('#target') .bind('click',function(event) { alert('Hello!'); }) .bind('click',function(event) { alert('Hello again!'); }) .bind('click',function(event) { alert('Hello yet again!'); }); 

我猜下面的代码是这样做的

 $('#target') .click(function(event) { alert('Hello!'); }) .click(function(event) { alert('Hello again!'); }) .click(function(event) { alert('Hello yet again!'); }); 

资料来源: http : //www.peachpit.com/articles/article.aspx?p= 1371947& seqNum=3

TFM还说:

当一个事件到达一个元素时,绑定到该元素的所有事件types的处理程序被触发。 如果有多个处理程序注册,它们将始终按照它们绑定的顺序执行。 所有处理程序执行完后,事件将继续沿着正常的事件传播path。

这两个处理程序被调用。

您可能会考虑内联事件绑定 (例如"onclick=..." ),其中一个重大缺陷是只能为事件设置一个处理程序。

jQuery符合DOM Level 2事件注册模型 :

DOM事件模型允许在单个EventTarget上注册多个事件侦听器。 为了达到这个目的,事件侦听器不再存储为属性值

使用2种方法使它成功工作:Stephan202的封装和多个事件监听器。 我有3个search标签,让我们在一个数组中定义他们的input文本ID:

 var ids = new Array("searchtab1", "searchtab2", "searchtab3"); 

当searchtab1的内容发生变化时,我想更新searchtab2和searchtab3。 是这样封装的:

 for (var i in ids) { $("#" + ids[i]).change(function() { for (var j in ids) { if (this != ids[j]) { $("#" + ids[j]).val($(this).val()); } } }); } 

多个事件监听器:

 for (var i in ids) { for (var j in ids) { if (ids[i] != ids[j]) { $("#" + ids[i]).change(function() { $("#" + ids[j]).val($(this).val()); }); } } } 

我喜欢这两种方法,但程序员select封装,但多个事件侦听器也工作。 我们使用Chrome来testing它。

有一个解决方法可以确保一个处理程序在另一个处理程序之后发生:将第二个处理程序附加到包含元素,并让事件冒泡。 在连接到容器的处理程序中,您可以查看event.target,如果它是您感兴趣的那个,请执行一些操作。

也许粗鲁,但肯定应该工作。