【问题标题】:Parent click events overlaps children click events父点击事件与子点击事件重叠
【发布时间】:2014-06-28 08:28:30
【问题描述】:

我希望能够点击父 div,但让子表单和锚元素免于点击事件。

<div class="root">

    <div class="parent">
        <div class="container">
            <a href="/blah"> Hello World</a>
            <div>
                <span> Hello World Again
            </div>
            <form class="form">
                <label> inputs
                <input id="text" type="text"/>
                <textarea></textarea>
                <input id="submit" type="submit"/>
            </form>
        </div>
    </div>

</div>

jQuery:

$(".parent").on("click", ".container", function() {
    alert("Parent clicked");
});

$(".parent").on("click", "#text", function(event) {
    event.preventDefault();
    alert("Form Input clicked");
});

$(".parent").on("click", "#submit", function(event) {
    event.preventDefault();
    alert("Form Button clicked");
});

 $(".parent").on("click", "a", function(event) {
    event.preventDefault();
    alert("anchor link clicked");
});   

单击任何表单元素(输入、文本区域、按钮提交)或锚标记将不起作用,因为父单击事件正在触发。

如何仅在子表单和锚标记之外的元素上进行父单击事件?父点击事件可以覆盖除这两个元素之外的任何其他子元素。

【问题讨论】:

    标签: javascript jquery html


    【解决方案1】:

    你有两个选择:

    1. click 事件挂在相关的子容器上(看起来像是表单)并在处理程序中使用event.stopPropagation()。这将阻止事件冒泡到父级。像这样的:

      // Option 1: Hook on the form and stop
      // propagation (hooking up "false" does an
      // implicit preventDefault + stopPropagation)
      $(".parent").on("click", "form", false);
      
    2. 在父处理程序中,检查父元素是否是事件的元素 (e.target)。如果是,则处理该事件;如果不是,请忽略它,它是在子元素上生成的。像这样的:

      $(".parent").on("click", ".container", function(event) {
          // Option 2: Look at event.target and ignore
          // the event if it originated in a descendant
          // element
          if (this === event.target) {
              alert("Parent clicked");
          }
      });
      

    请注意,它们做了两件略有不同的事情。第一个说“防止父母看到表单上的点击”,而第二个说“忽略不直接在.parent .container 上的点击”。当然,两者都可以针对不同的目标进行调整。

    活生生的例子:

    【讨论】:

    • 抱歉,我忘记了结束锚标记。我已经编辑了我的帖子以包含它。
    • @user21398:啊!这就解释了。我应该仔细看看。
    • 第二种方法似乎不适合我的场景,主要是因为我希望其他孩子被父母的点击覆盖。所以Hello World Again div/span 应该受到父母点击的影响,而锚点和表单不应该受到影响。第一种方法有效,但它似乎阻止了表单内的任何其他内容被点击。即,提交按钮不会触发自己的点击处理程序,这是一个大问题。
    • @user21398:它不在my example above 中,单击提交按钮就可以了。这很棘手,因为您的所有处理程序都被委派了,但我检查了它们连接的顺序是否有问题,it didn't seem to matter.
    • 刚刚也尝试了第二种方法,它似乎是一种更灵活的方法。很高兴知道!
    猜你喜欢
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    相关资源
    最近更新 更多