0

我对第二个事件处理程序有疑问。这有点复杂,因为我将我的脚本加载到其他页面(我无法修改该页面)并且这个脚本对点击事件做出反应。例如,当我单击该客户端页面的任何段落时,我的脚本会向我显示警报“单击”。如果该客户没有自己的点击处理程序,它就可以工作。我的点击功能什么时候永远不会运行。

此时脚本非常简单:

jQuery('body').click(function(event){
  alert('clicked');
});

有什么提示吗?对不起我的英语不好。

4

2 回答 2

2

形成我所理解的客户端可能会阻止事件从他们注册了点击处理程序的元素传播。

由于您正在将事件处理程序注册到body元素,因此仅当特定元素中的触发一直传播到元素时才会触发它body

一个肮脏的可能解决方案是将处理程序添加到页面中的所有元素,但这不适用于动态添加的元素。

jQuery('body *').click(function(event){
  alert('clicked');
});

演示:问题(点击 T1 不会触发点击事件)
演示:解决方案

于 2013-07-12T11:14:33.553 回答
0

对于clickbody. 元素上的处理程序可以通过取消冒泡event.stopPropagation()。如果他们处理事件,他们通常会这样做。

您不能在页面附加的处理程序之前获取事件,至少不能以任何直接的方式,因为即使您将处理程序附加到实际元素,它们也会按照附加的顺序执行,所以你的将在其他人之后。这没关系,除非他们使用event.stopImmediatePropagation(),这甚至阻止了附加到同一元素的其他处理程序被调用。

一个例子有帮助:让我们看看这个 HTML:

<body>
   <div id="target">........</div>
</body>

这些处理程序按以下顺序附加:

$("#target").click(function() {
    console.log("First direct handler");
});
$("#target").click(function() {
    console.log("Second direct handler");
});
$(document.body).click(function() {
    console.log("'body' handler");
});

如果我单击div,我们将在控制台中看到:Live Example | 直播源

第一个直接处理程序
第二直接处理程序
“身体”处理程序

现在,让我们更改第一个处理程序并让其他处理程序保持不变:

$("#target").click(function(e) {
    console.log("First direct handler");
    e.stopPropagation();
});

现在点击给我们这个: Live Example | 直播源

第一个直接处理程序
第二直接处理程序

由于第一个处理程序停止传播,body因此未调用处理程序。

让我们再次更改第一个处理程序:

$("#target").click(function(e) {
    console.log("First direct handler");
    e.stopImmediatePropagation();
});

现在点击给我们这个: Live Example | 直播源

第一个直接处理程序

我们甚至没有接到对第二个处理程序的调用,因为第一个处理程序停止了立即传播。

于 2013-07-12T11:14:41.303 回答