【问题标题】:click() event is calling twice in jQueryclick() 事件在 jQuery 中调用了两次
【发布时间】:2011-10-07 14:17:47
【问题描述】:

我设置了一个链接元素并在jQuery中调用了它的click事件,但是click事件调用了两次,请参见下面的jQuery代码。

$("#link_button")
.button()
.click(function () {
   $("#attachmentForm").slideToggle("fast");
});

【问题讨论】:

  • 问题可能出在脚本的其他地方。
  • 如果你找不到你在哪里做的事情要调用它两次,请在 click(...) 之前进行 unbind('clik')。
  • regilero:确切地说,整个代码库非常大。我应该在哪里解绑?
  • 您可以检测到哪些函数绑定到该点击事件:stackoverflow.com/questions/570960/…

标签: jquery


【解决方案1】:

确保并检查您没有在 HTML 页面中意外包含两次脚本。

【讨论】:

  • 这是我的问题。我的点击事件被冒泡了。感谢您的指点。 :) +1
  • 我只是看着这个解决方案并笑着想“​​我还没有愚蠢到这样做”......结果我确实做到了这一点。非常感谢。
  • 谢谢!这对我来说也是个问题。将它放在 laravel 刀片模板和在同一部分名称上调用 @parent 的嵌套模板中。哎呀。再次感谢!
  • 感谢您的提示。为此奋斗了 20 多个小时,这个提示让我走上了正确的道路。我使用的是 MVC ScriptBundles,但也直接链接到脚本文件,这重复了事件
  • 大声笑...我去过那里...我把责任归咎于第三方,但我两次链接了.js文件。
【解决方案2】:

点击前解除绑定;

$("#link_button").unbind('click');
$("#link_button")
.button()
.click(function () {
   $("#attachmentForm").slideToggle("fast");
});

【讨论】:

  • 试试 $("#link_button").unbind();或者做一个简单的测试来检查该代码被读取了多少次,如果不止一次......
  • 这只是每次都即时修复错误,而不是真正的解决方案。它可以解决问题并帮助了我,但您应该找到真正的问题并进行永久性修复。
  • 这对我来说真的很有用,因为在一些 ajax 调用之后,我需要用我的事件多次调用方法,它开始变得过度点击(我不知道这个词是否存在)。对于我的情况,这意味着一个解决方案。
  • 用只包含一次的脚本解决了我的问题。谢谢!
  • @ThiagoC.SVentura 是的,我的情况和你说的一样。这救了我!
【解决方案3】:

这意味着您的代码包含两次 jquery 脚本。 但是试试这个:

$("#btn").unbind("click").click(function(){

//your code

});

【讨论】:

    【解决方案4】:

    我试过了, e.stopImmediatePropagation(); 这似乎对我有用。

    【讨论】:

    【解决方案5】:

    在我的例子中,我使用下面的脚本来解决这个问题

    $('#id').off().on('click',function(){
        //...
    });
    

    off() 解除绑定到#id 的所有事件。 如果您只想取消绑定click 事件,请使用off('click')。

    【讨论】:

      【解决方案6】:

      只需在调用 .on() 之前调用 .off()。

      这将删除所有事件处理程序:

      $(element).off().on('click', function() {
      // function body
      });
      

      仅删除已注册的“点击”事件处理程序:

      $(element).off('click').on('click', function() {
      // function body
      });
      

      【讨论】:

        【解决方案7】:

        两次点击问题的一个相当常见的解决方案是放置

        e.stopPropagation()
        

        在函数的末尾(假设您使用function(e))。这可以防止事件冒泡,从而导致函数的第二次执行。

        【讨论】:

        • 最佳答案。
        【解决方案8】:

        我遇到了同样的问题,但你可以尝试更改此代码

        $("#link_button")
        .button()
        .click(function () {
           $("#attachmentForm").slideToggle("fast");
        });
        

        到这里:

        $("#link_button").button();
        $("#link_button").unbind("click").click(function () {
           $("#attachmentForm").slideToggle("fast");
        });
        

        对我来说,这段代码解决了这个问题。 但请注意不要在您的 HTML 页面中意外地两次包含您的脚本。 我认为如果你正确地做这两件事,你的代码就会正常工作。 谢谢

        【讨论】:

          【解决方案9】:

          这绝对是一个错误,特别是当它是 FireFox 时。我搜索了很多尝试了上述所有答案,最后被许多专家认为是错误的。所以,我终于想出了这个想法,通过声明变量像

          var called = false;
          $("#ColorPalete li").click(function() {
              if(!called)
              {
                       called = true;
                       setTimeout(function(){ //<-----This can be an ajax request but keep in mind to set called=false when you get response or when the function has successfully executed.
                           alert('I am called');
                           called = false;
                       },3000);
          
              }
          });
          

          以这种方式,它首先检查该函数之前是否被调用过。

          【讨论】:

            【解决方案10】:

            在我的函数开始时添加 e.preventDefault(); 对我有用。

            【讨论】:

              【解决方案11】:

              这段代码的 sn-p 没有什么不好的。正如@karim 所说,这是你脚本的另一部分

              【讨论】:

                【解决方案12】:

                请试试这个

                $('#ddlSupervisor').live('change', function (e) {
                    if (e.handled !== true) { //this makes event to fire only once
                    getEmployeesbySupervisor();
                    e.handled = true;
                   }
                });
                

                【讨论】:

                • 我将“live”更改为“on”,它似乎对我有用。因此,事件仅在单击按钮时触发。
                • 这是正确的。
                【解决方案13】:

                我不知道为什么,但我遇到了这个问题

                $(document).on("click", ".my-element", function (e) { });
                

                当我把它改成

                $(".my-element").click(function () { });
                

                问题已解决。但我的代码肯定有问题。

                【讨论】:

                • 这在 laravel 中对我有用,不知道是什么导致了这个问题
                • 我也有同样的问题。问题是如果您在加载文档后生成 html 标记,您的解决方案可能不起作用
                【解决方案14】:

                这是一个较老的问题,但如果您使用事件委托,这就是我的原因。

                删除.delegate-two 后,它停止执行两次。我相信如果两个代表都出现在同一页面上,就会发生这种情况。

                $('.delegate-one, .delegate-two').on('click', '.button', function() {
                    /* CODE */
                });
                

                【讨论】:

                  【解决方案15】:

                  在我的情况下,它在 Chrome 中运行良好,IE 调用了两次.click()。如果这是你的问题,那么我在调用 .click() 事件后通过返回 false 来修复它

                     $("#txtChat").keypress(function(event) {
                          if (event.which == 13) {
                              $('#btnChat').click();
                              $('#txtChat').val('');
                              return false;
                          }
                      });
                  

                  【讨论】:

                    【解决方案16】:

                    致电unbind 解决了我的问题:

                    $("#btn").unbind("click").click(function() {
                        // your code
                    });
                    

                    【讨论】:

                      【解决方案17】:

                      我被一个匹配多个项目的选择所欺骗,所以每个项目都被点击了。 :first 帮助:

                      $('.someClass[data-foo="'+notAlwaysUniqueID+'"]:first').click();
                      

                      【讨论】:

                        【解决方案18】:

                        我在 FF 上也遇到过这个问题。然而,我的标签绑定到 &lt;a&gt; 标签。尽管&lt;a&gt; 标记没有去任何地方,但它仍然进行了双击。我将&lt;a&gt; 标签换成了&lt;span&gt; 标签,双击问题就消失了。

                        如果链接不去任何地方,另一种选择是完全删除 href 属性。

                        【讨论】:

                        • 这并不能真正回答问题。如果您有其他问题,可以点击 进行提问。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。
                        • @SeanPatrickFloyd:实际上,这是一个答案。即使制定为引发危险信号。
                        【解决方案19】:

                        我遇到了这个问题,因为我的 $(elem).click(function(){}); 脚本被内嵌在一个设置为 style="display:none;" 的 div 中。

                        当 css 显示切换为阻塞时,脚本会再次添加事件监听器。我将脚本移动到单独的 .js 文件中,并且不再启动重复事件侦听器。

                        【讨论】:

                          【解决方案20】:

                          当我在jquery加载页面上使用此方法时,我在设置点击功能之前写了$('#obj').off('click');,所以不会出现气泡。对我有用。

                          【讨论】:

                            【解决方案21】:

                            我的简单答案是将点击绑定转换为一个函数,并从元素的 onclick 调用它 - 真是太好了!而以上都没有

                            【讨论】:

                              【解决方案22】:

                              当然,正如其他几个答案/cmets 所暗示的那样,“点击”事件再次绑定到同一元素上。

                              我遇到了类似的问题,为了验证这一点,我只是在我的脚本中添加了一个 console.log 命令,如下面的 sn-p:

                              $("#link_button")
                                  .button()
                                  .click(function () {
                                      console.log("DEBUG: sliding toggle...");
                                      $("#attachmentForm").slideToggle("fast");
                                  });
                              

                              如果单击该按钮后,您从浏览器的开发者控制台中看到类似于下图的内容(如我所做的那样),那么您肯定知道 click() 事件已两次绑定到同一个按钮。

                              如果您需要快速补丁,其他评论员提出的使用off 方法(顺便说一句unbind 自jQuery 3.0 起已弃用)在(重新)绑定之前取消绑定事件的解决方案效果很好,我建议它也是:

                              $("#link_button")
                                  .button()
                                  .off("click")
                                  .click(function () {
                                      $("#attachmentForm").slideToggle("fast");
                                  });
                              

                              很遗憾,这只是一个临时补丁!一旦让你老板高兴的问题解决了,你真的应该再深入研究一下你的代码并修复“重复绑定”问题。

                              实际的解决方案当然取决于您的具体用例。例如,就我而言,存在“上下文”问题。由于应用于文档特定部分的 Ajax 调用,我的函数被调用:重新加载整个文档实际上是重新加载“页面”和“元素”上下文,导致事件被绑定到元素两次.

                              我对这个问题的解决方案是利用 jQuery one 函数,它与 on 相同,只是事件在第一次调用后自动解除绑定。这对我的用例来说是理想的,但同样,它可能不是其他用例的解决方案。

                              【讨论】:

                                【解决方案23】:

                                如果您的事件调用两次或三次,甚至更多,这可能会有所帮助。

                                如果你使用类似的东西来触发事件……

                                $('.js-someclass').click();
                                

                                ...然后注意页面上.js-someclass 元素的数量,因为它会触发所有元素的点击事件——而不仅仅是一次!

                                一个简单的解决方法是确保您只触发一次点击,by selecting just the first element,例如:

                                $('.js-someclass:first').click();
                                

                                【讨论】:

                                  【解决方案24】:

                                  遇到了同样的问题。这对我有用 -

                                  $('selector').once().click(function() {});
                                  

                                  希望这对某人有所帮助。

                                  【讨论】:

                                  • 对我抛出一个错误...另外,它是一个肮脏的解决方案 - 该函数不止一次运行,解决方案是将它放在其他地方并使用 console.log() 来监控事情。
                                  【解决方案25】:

                                  在我的例子中,HTML 的布局是这样的:

                                  <div class="share">
                                    <div class="wrapper">
                                      <div class="share">
                                      </div>
                                    </div>
                                  </div>
                                  

                                  而我的 jQuery 是这样的:

                                  jQuery('.share').toggle();
                                  

                                  这让我很困惑,因为似乎什么都没有发生。问题是内部的.shares toggle 会抵消外部的.shares toggle。

                                  【讨论】:

                                    【解决方案26】:

                                    我通过更改元素类型解决了这个问题。 我放置输入而不是按钮,并且不会再出现此问题。

                                    关注:

                                    <button onclick="doSomthing()">click me</button>
                                    

                                    替换为:

                                    <input onclick="doSomthing()" value="click me">
                                    

                                    【讨论】:

                                      猜你喜欢
                                      • 1970-01-01
                                      • 2010-12-04
                                      • 2016-12-16
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 2016-07-09
                                      • 1970-01-01
                                      • 2017-10-07
                                      • 1970-01-01
                                      相关资源
                                      最近更新 更多