Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 事件捕获jQuery_Javascript_Jquery - Fatal编程技术网

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不支持事件捕获(解释:)。