Javascript 单击控制按钮后,单击“文档”按钮将引发火灾

Javascript 单击控制按钮后,单击“文档”按钮将引发火灾,javascript,jquery,Javascript,Jquery,我在jquery中创建了一个常见的click函数,每次单击文档上的任何位置时都会触发该函数。若控件有click事件,那个么该事件将首先激发,文档click将在之后激发,但我想在控件click事件之前激发文档click事件。请建议如何解决此问题。为您提供两个选项: 在现代浏览器上,可以通过使用事件的捕获阶段而不是冒泡阶段来实现这一点。此图有助于了解事件的各个阶段: IE不支持事件捕获,直到IE9处于标准模式(IE8和更早版本根本没有) jQuery没有提供用于使用事件捕获的API,因此您必须使用

我在jquery中创建了一个常见的click函数,每次单击文档上的任何位置时都会触发该函数。若控件有click事件,那个么该事件将首先激发,文档click将在之后激发,但我想在控件click事件之前激发文档click事件。请建议如何解决此问题。

为您提供两个选项:

  • 在现代浏览器上,可以通过使用事件的捕获阶段而不是冒泡阶段来实现这一点。此图有助于了解事件的各个阶段:

    IE不支持事件捕获,直到IE9处于标准模式(IE8和更早版本根本没有)

    jQuery没有提供用于使用事件捕获的API,因此您必须使用
    addEventListener

    document.querySelector("selector for the control").addEventListener("click", function(e) {
        // Control code here
    }, true);
    document.addEventListener("click", function(e) {
        // Document code here
    }, true);
    
    最后的
    true
    表示您希望使用捕获阶段,而不是冒泡阶段

  • 不要直接处理控件上的单击,使用事件委派,处理文档上的单击,如果单击通过控件,则从文档单击处理程序调用控件特定的处理:

    $(document).on("click", handleDocumentClick);
    
    function handleDocumentClick(e) {
      // On the next line, use whatever selector matches your controls
      var input = $(e.target).closest("input")[0];
      display("document click received");
      if (input) {
        handleControlClick.call(input, e);
      }
    }
    
    function handleControlClick(e) {
      display("control click received");
    }
    

  • 您可以使用
    live()
    live()
    将单击事件绑定到DOM的文档元素。当浏览器事件在DOM树中冒泡时,任何匹配元素都会触发click事件

    $(document).click(function() {
        alert('document');    
    });
    $(document).live('click', 'div', function() {
       alert('div'); 
    });
    

    当然,除了三年前(v1.7版)弃用了
    live
    ,一年半前(v1.9版)删除了它,而替换的
    on
    没有相同的行为(顺序不同)。
    的“严格使用”是什么意思??@T.J.Crowder感谢您的回复。我已经完成了所有的应用程序,我只想应用一些功能,它不可能改变所有的点击事件,所以请建议我更好的方法。事先谢谢。@supret:我想没有了。如果您说出了您试图应用的内容,我们可能可以,但是如果您已经以正常方式连接了所有事件处理程序,那么在元素级单击事件之前,没有快速简便的方法可以获得文档级单击事件。@T.J.Crowder谢谢:)@EhsanSajjad:
    “使用严格”
    告诉启用ES5的JavaScript引擎启用JavaScript的严格变体(“严格模式”)。严格模式是一件好事(tm)。一方面,它保护你不受伤害。