jQuery:同一事件的多个处理程序
如果我将两个事件处理程序绑定到同一个元素的相同事件,会发生什么?
例如:
var elem = $("...") elem.click(...); elem.click(...);
最后一个处理程序“获胜”,还是将这两个处理程序运行?
这两个处理程序都会运行,jQuery事件模型允许在一个元素上有多个处理程序,因此后面的处理程序不会覆盖旧的处理程序。
处理程序将按照它们绑定的顺序执行 。
假设你有两个处理器f和g ,并且要确保它们以已知和固定的顺序被执行,那么就把它们封装起来:
$("...").click(function(event){ f(event); g(event); });
这样(从jQuery的angular度来看)只有一个处理程序,它以指定的顺序调用f和g 。
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,如果它是您感兴趣的那个,请执行一些操作。
也许粗鲁,但肯定应该工作。