事件捕获 jQuery

IT技术 javascript jquery
2021-03-09 08:19:00

我需要捕获一个事件而不是让它冒泡。这就是我要的:

<body>
   <div>
   </div>
</body>

在这个示例代码中,我有一个以 div 和 body 为界的点击事件。我希望首先调用 body 事件。我该怎么做?

3个回答

改用事件捕获:-

$("body").get(0).addEventListener("click", function(){}, true);

检查“addEventListener”的最后一个参数默认情况下它是假的并且处于事件冒泡模式。如果设置为 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,您需要非常棘手。

@roasted:已经修正了我的评论,不确定它是否已经在 IE9 中得到支持。
2021-04-21 08:19:00
@FelixKling 这将在 IE 9 中工作,但现在在它之前。我正在为此更新
2021-04-23 08:19:00
我要试试这个。github.com/private-face/jquery.bind-first希望它能达到我想要的效果。
2021-04-29 08:19:00
@pvnarula 感谢您在回复中所做的努力。总是喜欢快速的小 jsfiddle。+1
2021-05-13 08:19:00
@FelixKling 适用于 IE9 但不低于
2021-05-14 08:19:00

我会这样做:

$("body").click(function (event) {
  // Do body action

  var target = $(event.target);
  if (target.is($("#myDiv"))) {
    // Do div action
  }
});
@AlwinKesler 这怎么不是正确的答案?它以此处介绍的最易读和最简洁的方式完成了 OP 想要的操作。
2021-04-19 08:19:00
问题中的第一句话明确指出,它是关于捕获而不是冒泡:“我需要捕获一个事件,而不是让它冒泡。” - 这个答案没有解决捕获与冒泡的问题,因此投反对票
2021-04-23 08:19:00
不能同意更多。我的意思是我看到对你的回答投反对票。我只是表达我的观点,说这种方法有助于最大限度地减少事件处理。但是,我不能说哪种方法更快
2021-04-29 08:19:00
这个答案是不正确的。jQueryclick绑定在气泡阶段。气泡阶段发生在捕获阶段之后。jQuery 不支持事件捕获(解释:stackoverflow.com/questions/7163616/...)。
2021-05-02 08:19:00
尽管这似乎不是这个问题的正确答案,但它仍然是实现预期行为的一种方式。通过浏览器处理一个单击事件,您可能有更快的响应时间并更轻松地指导您的业务逻辑。我不会对这个答案投反对票
2021-05-15 08:19:00

比@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;