【问题标题】:Why is the onClick event triggered twice?为什么onClick事件会触发两次?
【发布时间】:2014-10-05 13:08:30
【问题描述】:

我有以下html:

<span onclick="alert('Boem')">
    <button id="test1">test</button>
</span>

当我调用以下javascript时:

$('#test1').trigger('click');

onclick 事件被触发两次,而我希望它只触发一次。因为 JQuery 应该在 DOM 树中查找并且只找到一个 onclick。

我无法控制跨度,它是在第三方工具中生成的。我确实可以控制按钮及其参数。

您可以在这里找到一个 JSFiddle 示例: http://jsfiddle.net/Voga/v4100zke/

更新

我不知道 span 的 onclick 监听器的内容。这也是由 3rd 方工具生成的。我希望点击触发器像现在一样执行这个 onclick,但只执行一次。

【问题讨论】:

标签: javascript jquery html


【解决方案1】:

它调用了两次,因为按钮在跨度内并且跨度具有onclick="alert('Boem')",因此当您触发单击按钮时,它会显示警报,并且相同的点击事件传播到跨度并再次显示警报。

您需要使用以下代码停止按钮的默认行为:

$(function(){
$('#test1').click(function(e){e.preventDefault();}).click();
});

Demo

【讨论】:

  • 但我确实想传播到父跨度,因为那是点击事件所在的位置(而且我无法控制它)。我只希望它只触发一次事件,所以只显示一次“boem”
  • 页面加载时是否需要触发点击事件?
  • 不,这不是要求
  • 如果我阻止传播,我希望不会执行任何操作,因为按钮本身没有 onclick 属性?
  • 你检查过我更新的答案演示链接,这是你要找的吗?您的具体要求是什么?
【解决方案2】:

我也遇到了类似的问题,我必须下载一个下载两次的 pdf。我使用了 jQuery 的 stopImmediatePropagation 方法。

$( "#test1" ).on("click", function(e) {
     e.stopImmediatePropagation();
});

$('#test1').trigger('click');

stopImmediatePropagation 将阻止任何父处理程序以及任何其他处理程序执行。详情请参考here

【讨论】:

  • 就我而言,这是成功的。谢谢!
  • 非常感谢!!
【解决方案3】:

停止事件传播使用:stopPropagation

$( "#test1" ).on( "click", function(ev) {
    ev.stopPropagation();
});
$('#test1').trigger('click');

请注意,在 DOM 中按顺序分配事件。

DEMO

【讨论】:

    【解决方案4】:

    冒泡。子节点的点击事件也发生在父节点(跨度)上。

    【讨论】:

    • 但是为什么会触发2次。我知道按钮上的触发器也会触发父级,所以在这种情况下跨度,但它是唯一具有 onclick 的元素。所以我希望这个 onclick 只会触发一次?
    【解决方案5】:

    This thread 将帮助回答“为什么”。

    更好的方法是只为元素分配一个点击处理程序,以使您的 Javascript 从 HTML 中抽象出来:

    http://jsfiddle.net/v4100zke/3/

    $('#test1').click(function() {
        alert('Boem')
    });
    

    希望对您有所帮助。

    【讨论】:

      【解决方案6】:

      这也应该有效:

      $($('#test1').parent()).trigger('click');
      

      【讨论】:

      • 这确实是我用来临时解决问题的解决方案。我问了这个问题以了解这种行为的原因;-)。或许还能找到更优雅的解决方案。
      【解决方案7】:

      这里button click is triggered。由于buttonspan 内部,并且onclick 事件是为span 定义的,所以two alert 发生了。

      One is by the button 
      

      other by its parent(父级有onclick事件并触发按钮点击)。

      要避免两次警报,请使用此

      <span>
          <button onclick="alert('Boem')" id="test1">test</button>
      </span>
      

      【讨论】:

      • 但是该按钮没有onlclick参数所以它不执行任何操作。
      【解决方案8】:

      我遇到了同样的问题。我的事实是我使用了.trigger('.element'),并且element 类有两个元素。

      所以,我变得更具体,并使用.trigger('.parent .element') 来确保单个元素上只发生一次点击事件,而不是两个元素上发生一次点击事件。

      【讨论】:

        【解决方案9】:

        注意你使用了jQuery的click方法,它会同时发出dom的鼠标点击事件jquery的点击事件。然后 jquery 的点击事件dom 的鼠标点击事件 都被传播到 span 元素,并且它的 onclick 监听器被触发两次,因此它两次警报

        检查这个demo 想办法解决

        至于如何处理,就用stopPropagation作为上面的答案

        $('#test1').click(function() {
        
          // comment this line and run, 'parent' will be alerted TWICE!!! since both mouseEvent and jQuery.Event trigger the onclick listener
          $('#children').click(function(e) {e.stopPropagation()})
        
        });
        

        【讨论】:

          【解决方案10】:

          我在 Modal 上也遇到过这个问题

          通过以下技巧解决 -

          $('#saveButton').off('click').on('click', { modal: modal }, save)
          

          这里off('click') 防止保存方法多次触发。

          【讨论】:

            【解决方案11】:

            我已经尝试了上述所有建议,但不幸的是,上述所有建议都不适合我。 在我的情况下,“myBtn”是单独的 div,所以使用 flag 和 setTimeout 我已经达到了我想要的结果。请指教。

            我试过了:

            1. .off()
            2. .unbind()
            3. e.stopImmediatePropagation()
            4. e.preventDefault();

            下面是我的工作代码,我知道这不是一个好习惯,但现在我没有任何解决方案。请指教

            var isClicked = false;
            $("#myBtn").on("click",function(e){
                
                
                    if(!isClicked){
                        isClicked = true;
                        console.log("button clicked");
                        
            
                        setTimeout(function(){
                            isClicked = false;
                        },3000);
                    }
            
            })
             
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-07-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多