我需要捕获事件而不是让其冒泡。这就是我想要的:
<body>
<div>
</div>
</body>
我有一段示例代码,其中绑定了div和body的点击事件。我希望先调用body事件。该怎么做?
我需要捕获事件而不是让其冒泡。这就是我想要的:
<body>
<div>
</div>
</body>
我有一段示例代码,其中绑定了div和body的点击事件。我希望先调用body事件。该怎么做?
使用事件捕获代替:
$("body").get(0).addEventListener("click", function(){}, true);
默认情况下,请检查“addEventListener”的最后一个参数,它为false并处于事件冒泡模式。如果设置为true,则将以捕获事件工作。
用于跨浏览器实现。
var bodyEle = $("body").get(0);
if(bodyEle.addEventListener){
bodyEle.addEventListener("click", function(){}, true);
}else if(bodyEle.attachEvent){
document.attachEvent("onclick", function(){
var event = window.event;
});
}
默认情况下,IE8及更早版本使用事件冒泡。因此,我将事件附加到文档上而不是body上,所以您需要使用事件对象来获取目标对象。对于IE浏览器,您需要非常巧妙。
$("body").click(function (event) {
// Do body action
var target = $(event.target);
if (target.is($("#myDiv"))) {
// Do div action
}
});
click
事件绑定在冒泡阶段。冒泡阶段发生在捕获阶段之后。jQuery不支持事件捕获(解释:https://dev59.com/2mw05IYBdhLWcg3wkik-)。 - Elliot B.var global_handler = function(name, handler) {
var bodyEle = $("body").get(0);
if(bodyEle.addEventListener) {
bodyEle.addEventListener(name, handler, true);
} else if(bodyEle.attachEvent) {
handler = function(){
var event = window.event;
handler(event)
};
document.attachEvent("on" + name, handler)
}
return handler
}
var global_handler_off = function(name, handler) {
var bodyEle = $("body").get(0);
if(bodyEle.removeEventListener) {
bodyEle.removeEventListener(name, handler, true);
} else if(bodyEle.detachEvent) {
document.detachEvent("on" + name, handler);
}
}
shield_handler = global_handler("click", function(ev) {
console.log("poof")
})
// disable
global_handler_off("click", shield_handler)
shield_handler = null;