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

时间:2010-01-24 18:23:36

标签: jquery events

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

8 个答案:

答案 0 :(得分:83)

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

$("#myButton").unbind("click").click(myHandler); // deprecated
$("#myButton").off("click").click(myHandler); // superseeded

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

答案 1 :(得分:13)

鉴于您没有提供大量信息,我建议的最好的方法是查看一个()

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

答案 2 :(得分:8)

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

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

$("#myButton").unbind("click").click(myHandler);

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

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

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

$('#myButton').once('click', function(){
    // my handler
});

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

$('#myButton').once('click', data, function(){
    // my handler
});

您可以找到定义一次函数here的源代码。

它是AGPL许可下的开源软件,因此您可以随心所欲地抓住您需要的东西! :-)它也是日常积极开发的,所以你永远不会缺乏支持。

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

答案 3 :(得分:6)

对我而言,这是由

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

    //some exception-throwing code here
});

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

答案 4 :(得分:4)

您可以使用one()

$("div").one("click", function(e) { ... });
  

将处理程序附加到元素的事件。每个元素最多执行一次处理程序。

答案 5 :(得分:3)

这样会很好用。 它适合我。

DependencyProperty.UnsetValue

答案 6 :(得分:1)

在我最初使用$('#myButton')之前调用类似的东西。('click'...指定我的听众。

$('#myButton').off();

Documentation for "off();"

答案 7 :(得分:1)

模态对话框窗口出了问题。每次在会话中打开对话框时,事件都会触发一次。第一个窗口没问题,第二个窗口触发两次,第三个窗口触发三次等等。

我发现每次在同一会话中打开一个新的对话框窗口时,都会调用该对话框的初始化函数。我添加了一个全局变量notInit = -1,并在运行init时将值赋值为1。我在运行init函数之前检查了notInit的值,如果值为-1,则只进行init。