【发布时间】:2010-12-02 06:42:50
【问题描述】:
如果我将两个事件处理程序绑定到同一个元素的同一个事件会发生什么?
例如:
var elem = $("...")
elem.click(...);
elem.click(...);
最后一个处理程序“获胜”,还是两个处理程序都运行?
【问题讨论】:
标签: javascript jquery event-handling
如果我将两个事件处理程序绑定到同一个元素的同一个事件会发生什么?
例如:
var elem = $("...")
elem.click(...);
elem.click(...);
最后一个处理程序“获胜”,还是两个处理程序都运行?
【问题讨论】:
标签: javascript jquery event-handling
jquery 将执行这两个处理程序,因为它允许多个事件处理程序。 我已经创建了示例代码。你可以试试
【讨论】:
两个处理程序都会运行,jQuery 事件模型允许一个元素上有多个处理程序,因此后面的处理程序不会覆盖旧处理程序。
The handlers will execute in the order in which they were bound.
【讨论】:
jQuery('.btn').on('click',handlerClick); 在不同的地方被调用而实际上没有.off 它在任何地方?
bind 方法。详情请见:learn.jquery.com/jquery-ui/widget-factory/…
您应该能够使用链接来按顺序执行事件,例如:
$('#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 还说:
当一个事件到达一个元素时,所有绑定到该事件的处理程序 元素的类型被触发。如果有多个处理程序 注册后,它们将始终按照它们的顺序执行 边界。在所有处理程序都执行后,事件继续沿 正常的事件传播路径。
【讨论】:
jQuery 的 .bind() 按绑定顺序触发:
当一个事件到达一个元素时,所有绑定到该事件的处理程序 元素的类型被触发。如果有多个处理程序 注册后,它们将始终按照它们的顺序执行 边界。在所有处理程序都执行后,事件继续沿 正常的事件传播路径。
来源:http://api.jquery.com/bind/
因为jQuery的其他函数(例如.click())是.bind('click', handler)的快捷方式,我猜想它们也是按照绑定的顺序触发的。
【讨论】:
使用 2 种方法使其成功运行:Stephan202 的封装和多个事件侦听器。我有 3 个搜索选项卡,让我们在一个数组中定义它们的输入文本 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());
});
}
}
}
我喜欢这两种方法,但是程序员选择了封装,但是多个事件侦听器也可以工作。我们使用 Chrome 对其进行了测试。
【讨论】:
有一种解决方法可以保证一个处理程序一个接一个地发生:将第二个处理程序附加到包含元素并让事件冒泡。在附加到容器的处理程序中,您可以查看 event.target 并在您感兴趣的情况下执行一些操作。
粗略,也许,但它绝对应该工作。
【讨论】:
假设您有两个处理程序,f 和 g,并希望确保它们以已知且固定的顺序执行,那么只需封装它们:
$("...").click(function(event){
f(event);
g(event);
});
这样(从jQuery的角度来看)只有一个处理程序,它以指定的顺序调用f和g。
【讨论】:
两个处理程序都被调用。
您可能会想到inline event binding(例如"onclick=..."),其中一个很大的缺点是只能为一个事件设置一个处理程序。
jQuery 符合DOM Level 2 event registration model:
DOM 事件模型允许 多事件登记 单个 EventTarget 上的侦听器。到 实现这一点,事件监听器没有 不再存储为属性值
【讨论】: