Javascript 事件捕获jQuery
我需要捕捉一个事件,而不是让它冒泡。这就是我想要的:Javascript 事件捕获jQuery,javascript,jquery,Javascript,Jquery,我需要捕捉一个事件,而不是让它冒泡。这就是我想要的: <body> <div> </div> </body> 从这个示例代码中,我有一个在div和主体上绑定的click事件。我希望首先调用body事件。如何进行此操作?请改用事件捕获:- $("body").get(0).addEventListener("click", function(){}, true); 检查“addEventListener”的最后一个参数。默认情况下
<body>
<div>
</div>
</body>
从这个示例代码中,我有一个在div和主体上绑定的click事件。我希望首先调用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和更早版本默认使用事件冒泡。所以我将事件附加到文档而不是主体上,所以需要使用事件对象来获取目标对象。对于IE,你需要非常小心。我会这样做:
$("body").click(function (event) {
// Do body action
var target = $(event.target);
if (target.is($("#myDiv"))) {
// Do div action
}
});
比@pvnarula的答案更一般:
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;
jQuery不支持捕获,因为IE不支持它。挑剔:jQuery是JavaScript。您必须求助于“普通”DOM API;)你的意思是你从来没有编码过,还是你建议其他人永远不要用纯JS编码?@FelixKling在IE9上工作,但不是belowI,我要试试这个。希望它能达到我想要的效果。@FelixKling这将在IE9中起作用,但现在在它之前。我正在更新that@roasted:已修复我的评论,不确定它是否已在IE9中得到支持。@pvnarula感谢您的回复。总是喜欢敏捷的小东西+1尽管这似乎不是这个问题的正确答案,但它仍然是实现预期行为的一种方式。通过浏览器处理一次单击事件,您可能会有更快的响应时间,并更轻松地引导您的业务逻辑。我不会投反对票answer@AlwinKesler这怎么不是正确的答案?它以这里介绍的最具可读性和简洁的方式完全符合OP的要求。完全同意。我的意思是我看到对你的答案投了反对票。我只是表达我的观点,说这种方法有助于最小化事件处理。但是,我不能说哪种方法更快。问题中的第一句话清楚地说明了它是关于捕获和不冒泡的:“我需要捕获事件,而不是让它冒泡。”-这个答案没有涉及捕获和冒泡,因此这个答案是不正确的。jQuery
单击气泡阶段的绑定。气泡阶段发生在捕获阶段之后。jQuery不支持事件捕获(解释:)。