click()事件在jquery中调用了两次


113

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

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

请指教。

谢谢。


2
问题可能出在脚本的其他地方。
karim79 2011年

3
如果找不到在何处两次调用它,请在click(...)之前进行unbind('clik')。
regilero

regilero:确切地说,整个代码库非常大。我应该在哪里取消绑定?
domlao 2011年

2
:你可以检测一下函数绑定到click事件stackoverflow.com/questions/570960/...
映范

Answers:


229

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


1
这是我的情况的问题。我的点击事件变得沸腾了。感谢您的指导。:) +1
塔希尔·阿克拉姆

22
我只是看着这个解决方案,然后笑着以为“我还不够愚蠢”。非常感谢。
JazzyP 2014年

1
谢谢!原来这也是我的问题。在laravel刀片模板和嵌套的模板(在同一节名称中调用@parent)中都有它。哎呀。再次感谢!
菲利普·哈灵顿

1
感谢您的提示。奋斗了20多个小时,这个技巧使我走上了正确的道路。我使用的是MVC ScriptBundles,但也直接链接到脚本文件,因此重复了事件
Manish

大声笑...我去过那里...我把责任归咎于第三方,但正是我两次链接了.js文件。
朱利安

76

单击之前取消绑定;

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

1
尝试$(“#link_button”)。unbind(); 或进行简单测试以检查该代码被读取了多少次(如果多次)...
TheSystem

3
只是每次都在动态修复错误,而不是真正的解决方案。它可以解决问题并为我提供了帮助,但是您应该找到真正的问题并进行永久修复。
Juan Ignacio

1
在我的情况下这真的很有用,因为在一些ajax调用之后,我需要多次调用带有事件的方法,该方法开始变得被点击(我不知道这个词是否存在)。对我而言,这意味着一种解决方案。
Thiago C. S Ventura

修复了仅包含一次脚本的问题。谢谢!
K. Rhoda



18

就我而言,我使用以下脚本克服了这个问题

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

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


8

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

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

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

要仅删除已注册的“ click”事件处理程序,请执行以下操作:

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

7

解决两次点击问题的一种比较常见的方法是

e.stopPropagation()

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


6

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

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

对此:

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

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


3

请尝试这个

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

我将“ live”更改为“ on”,它似乎对我有用。因此,单击该按钮时,事件仅触发一次。
Vikneshwar '16

这是现场。
LargeTuna19年

3

特别是在FireFox上,这绝对是一个bug。我搜索了很多上述所有答案,并最终被许多专家认为是错误。所以,我最终通过声明如下变量提出了这个想法

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);

    }
});

通过这种方式,它首先检查而不是先前是否调用过该函数。



3

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

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

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

2

该代码段没有任何不好的地方。正如@karim所说,这是脚本的另一部分


2

就我而言,它在Chrome中运行良好,而IE则.click()两次拨打电话。如果这是您的问题,则在调用该.click()事件后,我通过返回false修复了该问题

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

2

打电话unbind解决了我的问题:

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

2

我不确定为什么,但是我遇到了这个问题

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

当我将其更改为

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

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


这对我在拉拉维(Laravel)起作用,不知道是什么原因造成的
汗·法

1

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

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

1

我在FF上也有这个问题。但是,我的标签已绑定到<a>标签。尽管该<a>标签没有移到任何地方,但仍然可以双击。我将<a>标签替换为标签,<span>双击问题消失了。

另一种选择是,如果链接没有任何作用,则完全删除href属性。


这并不能真正回答问题。如果您有其他问题,可以点击提问进行提问。一旦您有足够的声誉,您还可以悬赏以吸引更多对此问题的关注。
肖恩·帕特里克·弗洛伊德

@SeanPatrickFloyd:实际上,这是一个答案。即使制定升起红旗。
Deduplicator 2015年

1

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

当css显示切换为“阻止”时,脚本将第二次添加事件侦听器。我将脚本移到了一个单独的.js文件,并且不再启动重复的事件侦听器。


1

当我在带有jquery的加载页面上使用此方法时,我$('#obj').off('click');在设置click函数之前就进行了编写,因此不会出现气泡。为我工作。


1

我的简单答案是将click绑定转换为函数,然后从元素的onclick调用该函数-很好用!而以上都不是


0

如果您的活动呼叫了两次或三次或更多,这可能会有所帮助。

如果您正在使用类似的方式触发事件…

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

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

一个简单的解决方法是通过仅选择第一个元素来确保仅触发一次单击,例如:

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

0

可以肯定的是,在脚本中其他位置,“点击”事件又被绑定到同一元素,正如其他一些答案/评论所暗示的那样。

我有一个类似的问题,为了验证这一点,我只是向console.log脚本添加了一个命令,如以下代码片段所示:

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

如果在单击按钮时从浏览器的开发人员控制台中获得类似于下图的图像(就像我所做的那样),那么您可以确定该click()事件已两次绑定到同一按钮。

开发者的控制台

如果您需要快速修补程序,则其他注释者提出的使用该off方法(unbind自jQuery 3.0起不推荐使用btw )取消绑定事件的方法,然后再重新绑定它就可以了,我也建议这样做:

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

不幸的是,这只是一个临时补丁!解决使老板满意的问题后,您应该真正深入研究代码并解决“重复绑定”问题。

实际的解决方案当然取决于您的特定用例。以我为例,存在一个“上下文”问题。我的函数被调用是由于对文档的特定部分进行了Ajax调用的结果:重新加载整个文档实际上是在重新加载“ page”和“ element”上下文,导致事件两次绑定到元素。

我对这个问题的解决方案是利用jQuery 一个功能,该功能与on相同,不同之处在于该事件在第一次调用后会自动解除绑定。对于我的用例而言,这是理想的选择,但同样,对于其他用例而言,它可能不是解决方案。


-1

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

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

希望这对某人有帮助。


给我抛出一个错误...而且这是一个肮脏的解决方案-该函数已运行了不止一次,解决方案是将其放置在其他位置并使用console.log()监视事物。
tylerl

-1

就我而言,HTML的布局如下:

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

我的jQuery就像这样:

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

这让我感到困惑,因为似乎什么也没有发生。问题是内部.shares toggle 抵消了外部.shares toggle


-1

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

安装于:

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

用。。。来代替:

<input onclick="doSomthing()" value="click me">
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.