Click()事件在 jQuery 中调用两次

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

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

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

这段代码没有包含任何不好的内容,这是@karim 告诉你的脚本的另一部分

在点击之前解除绑定;

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

我也有同样的问题,这招对我很管用

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

希望这对谁有帮助。

我也有同样的问题,但是你可以试着修改这个代码

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

回到这里:

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

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

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

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


//your code


});

这绝对是一个漏洞,特别是当它是火狐的时候。我搜索了很多,尝试了以上所有的答案,最后得到了它作为错误的许多专家超过所以。最后,我通过声明

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


}
});

通过这种方式,它首先进行检查,而不是先前调用或未调用函数。

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

e.stopPropagation()

在函数结束时(假设您使用 function(e))。这样可以防止事件冒泡而导致函数的第二次执行。

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

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

请尝尝这个

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

当我用 jquery 在装载页面上使用这个方法时,我在设置 click 函数之前编写 $('#obj').off('click');,所以不会出现气泡。我没问题。

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

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

我在 FF 上也有这个问题。然而,我的标签被绑定到一个 <a>标签。虽然 <a>标签没有去任何地方,它仍然做了双击。我将 <a>标记替换为 <span>标记,双击问题消失了。

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

在我的例子中,HTML 的布局如下:

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

我的 jQuery 是这样的:

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

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

我尽力了, e.stopImmediatePropagation(); 我觉得这样挺好。

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

当 css 显示切换到 block 时,脚本将再次添加事件侦听器。我把剧本移到了一个单独的地方。Js 文件和重复事件侦听器不再启动。

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

在我的案例中,我使用下面的脚本来克服这个问题

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

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

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

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

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

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

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

只删除已注册的“ click”事件处理程序:

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

我的简单回答是将单击绑定转换为一个函数,并从元素的 onclick 调用该函数——非常棒!而上述所有人都没有

我不知道为什么,但我有这个问题

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

当我改成

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

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

我通过改变元素类型来解决这个问题。 而不是按钮,我把输入,这个问题不会发生更多。

而不是:

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

取代:

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

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

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

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

如果事件调用两次或三次以上,这可能会有所帮助。

如果你用这样的东西来触发事件..。

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

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

一个简单的解决办法就是确保你只触发一次点击,比如 只选择第一个元素,例如:

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

当然,在你的脚本的其他地方,“点击”事件又被绑定到同一个元素上,就像其他一些回答/评论所暗示的那样。

我也遇到过类似的问题,为了验证这一点,我只是在脚本中添加了一个 console.log命令,如下面的代码片段所示:

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

如果在单击按钮时,您从浏览器的开发者控制台获得了类似于下面图片的内容(正如我所做的) ,那么您肯定知道 click()事件已经被绑定到同一个按钮两次。

the developer's console

如果你需要一个快速的补丁,其他评论者提出的解决方案是使用 off方法(btw unbind是不推荐的,因为 jQuery 3.0)在(重新)绑定事件之前解除绑定,我也推荐它:

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

不幸的是,这只是一个临时补丁!一旦让你的老板高兴的问题得到解决,你真的应该更深入地研究一下你的代码并修复“重复绑定”的问题。

实际的解决方案当然取决于您的特定用例。例如,在我的案例中,有一个“上下文”的问题。我的函数是作为应用于文档特定部分的 Ajax 调用的结果被调用的: 重新加载整个文档实际上是同时重新加载“页面”和“元素”上下文,导致事件被绑定到元素两次。

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