jQuery:单击按钮,单击事件两次或多次

gho*_*mes 30 jquery events

我有HTML输入和按钮元素.我使用按钮提交表单,打开辅助窗口等.问题是,单击即可转换为2(有时甚至更多)表单提交,或打开另外两个浏览器窗口.我在多个Web浏览器中重现了这个问题.我试过切换jQuery版本,但没有改变任何东西.什么可能导致这种事情发生?

Dar*_*o Z 83

您的问题可能正在发生,因为您多次为click事件分配相同的处理程序.我建议您检查分配处理程序的行未被无意中多次调用.另一个解决方案可能是先调用unbind(已弃用3.0)或off(取代):

$("#myButton").unbind("click").click(myHandler); // deprecated
$("#myButton").off("click").click(myHandler); // superseeded
Run Code Online (Sandbox Code Playgroud)

但是没有看到一些代码,我只是在猜测.


Jar*_*man 13

鉴于您没有提供大量信息,我可以推荐的最好的是看一个()

http://api.jquery.com/one/


bal*_*ton 8

jQuery Sparkle为此提供了一个干净优雅的解决方案,通过调用函数"once",您只需将处理程序绑定到事件一次.

与使用Darko Z的建议相比,这是一个重要的改进:

$("#myButton").unbind("click").click(myHandler);
Run Code Online (Sandbox Code Playgroud)

每次调用时,都会取消绑定与"click"事件关联的任何其他"click"处理程序.所以你确定它确保它只被绑定一次,但是你不小心解除了其他一切!哎呀!

jarrett的建议在调用之后立即取消绑定"click"处理程序,因此如果你想再次调用处理程序(在它初始触发之后),你将不得不重新绑定处理程序.

使用jQuery Sparkle曾经允许处理程序根据需要多次触发,但只能绑定一次而不是多次绑定.你可以像这样使用它:

$('#myButton').once('click', function(){
    // my handler
});
Run Code Online (Sandbox Code Playgroud)

或者,如果您想在回调中支持数据,就像jQuery内置的"bind"一样,那么您可以使用:

$('#myButton').once('click', data, function(){
    // my handler
});
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到用于定义once函数的源代码.

它是AGPL许可下的开源软件,因此您可以随心所欲地获取所需内容!:-)它也是日常积极开发的,所以你永远不会缺乏支持.

但最重要的是,它是一个DRY插件/效果框架,可以让您更轻松地开发插件和扩展.希望这有助于实现这一目标!


Wal*_*alf 6

对我而言,这是由

$(function() {
    $('.some-element').click(function() {
        //event that fires twice
    });

    //some exception-throwing code here
});
Run Code Online (Sandbox Code Playgroud)

由于异常,jQuery两次调用匿名就绪函数(?!),因此click函数将被绑定两次.