【问题标题】:Prevent javascript onclick on child element防止javascript onclick子元素
【发布时间】:2009-09-16 09:01:55
【问题描述】:

好的,简单的问题:

<div onclick="javascript:manualToggle(this)">
    <span>Allowed to click</span>
    <span>Not allowed to click</span>
    <span>Allowed to click</span>
</div>

如果不将 manualToggle 复制到允许单击的 2 个跨度上,如何防止“不允许单击”跨度在单击时触发其父 div onclick 事件?

【问题讨论】:

    标签: javascript html onclick


    【解决方案1】:

    给 span 一个 id 附加 onclick 事件并使用

    一个 jQuery 示例

    $("#spn2").click(function(event){
      event.stopPropagation();  
    });
    

    event.stopPropagation():停止将事件冒泡到父元素,防止任何父处理程序收到事件通知。

    【讨论】:

    • 我选择了类似的东西,但没有使用 stopPropagation。 (我没有对这个问题投反对票...)
    • 正确答案和有效解决方案之间存在差异。这实际上是这个问题的正确答案。谢谢!
    【解决方案2】:

    使用库是有意义的,但没有你可以尝试这个(用整个页面编辑来测试):

    <html><head></head>
    <body>
    <script type="text/javascript"><!--
    function manualToggle(val)
    {
        alert(val.id);
    }
    
    --></script>
    
    <div id="test" onclick="manualToggle(this);">
        <span>Allowed to click</span>
        <span onclick="event.cancelBubble=true;if (event.stopPropagation) event.stopPropagation();">Not allowed to click</span>
        <span>Allowed to click</span>
    </div>
    </body>
    </html>
    

    【讨论】:

    • event? e?好像少了什么东西
    • Thx,e 不起作用我只在 cancelBubble 浏览器中测试了它,我将其更改为 event(即 window.event)并在其中放置了一些测试代码。它至少在 FF 3.5 和 IE7 中有效
    【解决方案3】:

    您需要一个事件处理程序(在 jQuery 之类的东西中很容易做到这一点),它可以捕获 div 内跨度的点击,并且仅在例如跨度具有/没有特定类时触发该函数。

    【讨论】:

      【解决方案4】:

      我只是遇到了同样的问题,无法让 jQuery 工作,所以我使用了简单的 Javascript:

      document.getElementById("your_span").addEventListener("click", (event) => {
          event.stopPropagation();
      });
      

      这对我有用。显然,您需要将addEventListener 添加到您想要应用它的每个元素中。因为我做了很多 DOM 操作,所以这对我来说不是问题。 希望这对任何人都有帮助:)

      【讨论】:

        【解决方案5】:

        mootools可以使用stopPropagation的方法:

        $('myChild').addEvent('click', function(ev){
            ev.stopPropagation(); // this will prevent the event to bubble up, and fire the parent's click event.
        });
        

        http://mootools.net/docs/core/Native/Event#Event:stopPropagation

        也看到这个非常相似的问题:How can I stop an onclick event from firing for parent element when child is clicked?

        【讨论】:

        • 对你推荐的 js-library 投反对票,就像 phoenix 推荐 jQuery 一样
        • 使用库是最简单(也是最兼容浏览器)的方式
        • 我使用公认的答案来交换一些位并使用 jQuery 来实现我所需要的。谢谢你的回答。 (我没有对这个问题投反对票...)
        【解决方案6】:

        可能的解决方案:给出 span 的 id 并检查点击的 id 是否允许在你的函数中被点击

        坏主意:您不知道点击了哪个跨度,因为您从 div 调用函数...

        【讨论】:

          【解决方案7】:
          <div onclick="manualToggle(this)">
              <span>Allowed to click</span>
              <span>Not allowed to click</span>
              <span>Allowed to click</span>
          </div>
          <script>
              function manualToggle(cur){
                if(cur !== event.target) return false;
                 
                 //CODE
              }
          </script>
          

          这里我们在 div 标签上设置了一个点击事件, 我们将当前元素(div)作为参数传递

          在 manualToggle 函数中,您可以在 params 中设置事件的元素,

          在函数里面我们有事件(一个全局的var对象),在这里你可以得到被点击的元素(event.target),

          如果点击的元素与我们设置事件的元素不同(等于),则什么也不做。

          还有一些其他的方法也可以,使用stopPropagation

          https://developer.mozilla.org/en-US/docs/Web/API/Event/stopPropagation

          【讨论】:

          猜你喜欢
          • 2016-11-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-23
          • 2015-01-15
          • 2013-08-22
          相关资源
          最近更新 更多