【问题标题】:Disable the onclick event of a parent element禁用父元素的onclick事件
【发布时间】:2011-03-26 22:24:07
【问题描述】:

假设我有一个带有 onclick 事件的元素,以及其中的另一个元素,如何禁用子元素的 onclick?

示例:
<h3 onclick="do something"><input type="checkbox" name="child" /> text</h3>

选中复选框时,不应触发 onclick 事件。

谢谢。

【问题讨论】:

  • 你为什么要这么做?
  • 如果取消选中该复选框会怎样?
  • 你想点击“文本”来切换复选框吗?
  • 我正在尝试这样做,因为

    实际上是一个下拉菜单,我不希望操作复选框会触发下拉菜单。我的意思是操作复选框,而不仅仅是检查。

标签: javascript


【解决方案1】:

Javascript 事件是自下而上传播的,即如果你点击一个按钮,所有的上层都会按顺序收到 onclick 事件,除非其中一个通过 stopPropagation 拦截它(或返回 true,这意味着我处理了这个)

例子:

<h3 onclick="do something"><input type="checkbox" name="child" onclick="return false;" /> text</h3>

您还可以将父级的 onclick 绑定到一个函数:

function onlick_handler(e)
{
   e.stopPropagation(); //this event would propagate to parents of this object which are clicked as well
   // the rest here
}

【讨论】:

  • 该功能不是独立的,您应该先将其绑定到onclick事件。与jQuery, use $("h3").bind("click","onclick_handler");
  • e.stopPropagation 工作正常,但是,我没有让带有 onclick="return false" 的版本也能正常工作
【解决方案2】:

您的处理程序(h3 标记的“do something”部分)可以检查原始元素的tagName:

var origin = event.srcElement || event.target;
if (origin.tagName && origin.tagName.match(/h3/i)){
  // do things
} else {return true;}

现在对于复选框,点击处理程序已触发,但不会发生任何事情。或者,您可以为 h3-tag 提供一个唯一 id 并检查被点击元素的 id。

【讨论】:

    【解决方案3】:

    【讨论】:

      【解决方案4】:

      我可以建议this anwser我提供的类似问题吗?

      上面我复制了我原来的答案:


      我遇到了与您的第一个问题非常相似的问题。但取而代之的是一个

      和一个复选框,它是一个表格。看看我的 NON WORKING 代码:
      <table>
        <tr onClick="alert('I expect this alert when Cell_1 or Cell_2 are clicked but not Cell_3')">
          <td>Cell_1</td>
          <td>Cell_2</td>
          <td onClick="alert('I expect this alert only when Cell_3 is clicked')">Cell_3</td>
        </tr>
      <table>
      

      单击 Cell_1 或 Cell_2,我的代码按预期工作,但单击 Cell_3 时却没有,因为它显示 2 个警报。

      第一个是:

      “我希望只有在单击 Cell_3 时才会出现此警报”

      第二个是:

      我希望在单击 Cell_1 或 Cell_2 而不是 Cell_3 时出现此警报。

      Google-ing 我怎么能做到这一点,我在 Quirksmode 上找到了 this briliant 的帖子。

      嗯,简单地说,我可以这样解决这个难题:

      <table>
        <tr onClick="alert('I expect this alert when Cell_1 or Cell_2 are clicked but not Cell_3')">
          <td>Cell_1</td>
          <td>Cell_2</td>
          <td onClick="Cell_3Alert(event)">Cell_3</td>
        </tr>
      <table>
      

      还有 Javascript:

      function Cell_3Alert(e) {
        alert('I expect this alert only when Cell_3 is clicked');
      
        if (!e) var e = window.event; 
        e.cancelBubble = true;
        if (e.stopPropagation) e.stopPropagation();
      }
      

      我已经测试过,它可以在 FireFox 3.6+、IE6+ 和 Chrome 上运行。

      希望对你有帮助!

      【讨论】:

        【解决方案5】:

        您可以为复选框设置一个 onClick,如果选中该复选框,则将 h3.onClick 属性设置为空白,如果未选中,则将其设置为正确的函数引用。

        【讨论】:

          猜你喜欢
          • 2021-03-21
          • 2013-12-28
          • 2015-08-27
          • 2010-11-02
          • 1970-01-01
          • 2012-11-05
          • 2019-02-26
          • 2021-03-06
          • 2016-06-23
          相关资源
          最近更新 更多