jQuery Button.click()事件被触发两次


78

此代码存在以下问题:

<button id="delete">Remove items</button>

$("#delete").button({
     icons: {
             primary: 'ui-icon-trash'
     }
}).click(function() {
     alert("Clicked");
});

如果单击此按钮,警报将显示两次。我不仅创建了这个特定的按钮,而且还创建了每个按钮。

我究竟做错了什么?


Answers:


65

您当前的代码有效,您可以在这里尝试:http : //jsfiddle.net/s4UyH/

在示例之外,您还有其他东西触发另一个.click(),检查其他处理程序是否也在click该元素上触发了一个事件。


28
你是对的!我在.click()前面放了一个.unbind(“ click”)。现在它可以正常工作了。我必须搜索第二次触发事件的元素...非常感谢!
user276289 2010年

1
听起来更像是您两次绑定了同一单击事件。jQuery将对绑定进行排队,因此,如果将多个单击事件绑定到同一元素,则单击它们时,它们都会触发。稍微的不同是click事件被触发了两次,而绑定到元素的相同click事件被触发了两次。
MacAnthony 2010年

16
@ user276289-您的代码整体上可能会运行多次,请确保页面中仅包含一次。
尼克·克雷弗

3
谢谢尼克·克拉弗!那正是我的问题,我将代码内联在jQuery对话框上,因此在呈现jQuery UI对话框时再次执行了该代码。
詹姆斯

3
那是正确的答案。很多时候,双重加载相同的JS文件也会导致此错误。

128

在这种情况下,我们可以执行以下操作

$('selected').unbind('click').bind('click', function (e) {
  do_something();
});

我最初将事件触发两次,当刷新页面时,它将触发四次。过了无结果的几个小时之后,我才想到Google搜索。

我还必须说,直到我开始使用JQueryUI手风琴小部件之前,代码才开始起作用。


8
此变体也适用:$('.element').unbind("click").on('click', function(e) { ... });
Rosdi Kasim 2014年

正是我想要的。也可以确认@RosdiKasim的评论是正确的-这就是我所使用的。
Novocaine 2015年

这是我一直在寻找的答案,并且在5分钟之内得到了..谢谢
Alauddin Ahmed

38

我也经历过奇怪的行为。因此,对我来说,“返回假”就可以了。

        $( '#selector' ).on( 'click', function() {
            //code
            return false;
        });

谢谢!就我而言,我无法解除绑定或关闭事件处理程序,而只是返回false起作用了!
bergie3000,2015年

6
这也为我工作,但我想知道为什么。
阿伦刘

看看Noor的答案。
Arman Petrosyan

1
这对我有用。点击不会被多次触发。但是,如果单击绑定到复选框,则不会在click事件上选中它。
丽贝卡·梅里兹

19

如果您使用

$( document ).ready({ })

要么

$(function() { });

单击功能将触发多次,而不是使用多次。


1
这个固定的地雷问题。
Kvvaradha

13

你可以试试看

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

8

这可以作为很好地兼具触发inputlabel 内部与点击收听的元素。

你点击label,这将触发click事件和以及对再点击一下事件inputlabel。这两个事件都会影响到您的元素。

看到这只花式CSS切换笔:https : //codepen.io/stepanh/pen/WaYzzO

注意:这不是jQuery特有的,本机侦听器被触发2次,如笔所示。


那么,该如何解决?这是我的情况
mars-o

3

我遇到了同样的问题,并尝试了一切,但没有成功。因此,我使用了以下技巧:

function do_stuff(e)
{
    if(e){ alert(e); }
}
$("#delete").click(function() {
    do_stuff("Clicked");
});

您要检查该参数是否不为空而不是代码。因此,当函数第二次触发时,它将显示您想要的内容。



2

这可能是由于以下原因引起的:

  1. 您在同一HTML文件中多次包含了脚本
  2. 已经onclick在元素上使用属性添加了事件监听器
  3. 如果你使用template inheritanceextendsdjango,很可能你已经包含在多个文件中的脚本,其被组合在一起includeextend
  4. 事件被冒泡了一些父元素。
  5. 如果您使用的是django模板,则错误地将block另一个内部放置了

因此,您应该找到它们并删除重复的导入。这是最好的事情。

另一个解决方案是click首先在脚本中删除所有事件侦听器,例如:

$("#myId").off().on("click", function(event) {
event.stopPropagation();
});

event.stopPropagation();如果您确定事件未冒泡,则可以跳过。


1

我发现在一个函数中绑定一次element.click会使其排队,因此,下次单击它时,它将触发绑定函数执行的次数。新来者的错误可能会给我带来麻烦,但我希望它会有所帮助。TL,DR:确保将所有单击绑定到仅发生一次的设置功能上。


1

就像Nick想要说的一样,外部的某些事件两次触发了该事件。要解决此问题,应使用event.stopPropagation()防止父元素冒泡。

$('button').click(function(event) {
    event.stopPropagation();
});

我希望这有帮助。


这对我不起作用。大多数原因导致点击被多次触发。
丽贝卡·梅里茨

1

就我而言,我像这样使用change命令

$(document).on('change', '.select-brand', function () {...my codes...});

然后我改变了方式

$('。select-brand')。on('change',function(){...我的代码...});

它解决了我的问题。


0

除非您希望您的按钮是一个提交按钮,否则将其编码为“应该解决您的问题的删除项目”。如果未指定按钮元素的类型,则默认为提交按钮,从而导致您发现问题。


抱歉-奇怪地上传了。只需在您的按钮标签内添加type =“ button”即可。
user2672224

0

与Stepan的答案有关。

在我的情况,我都inputlabel我的.click()听众。

我只是将替换labeldiv,它起作用了!


0

如果您使用的是AngularJS:

如果您使用的是AngularJS,并且您的jQuery click事件位于INSIDE THE CONTROLLER内,它将被Angular的框架本身打扰,并触发两次。要解决此问题,请将其移出控制器并执行以下操作:

// Make sure you're using $(document), or else it won't fire.
$(document).on("click", "#myTemplateId #myButtonId", function () {
   console.log("#myButtonId is fired!");
   // Do something else.
});

angular.module("myModuleName")
   .controller("myController", bla bla bla)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.