我有HTML输入和按钮元素。我使用按钮提交表单,打开辅助窗口等。问题是,单击即可转换为2(有时甚至更多)表单提交,或打开另外两个浏览器窗口。我在多个Web浏览器中重现了这个问题。我试过切换jQuery版本,但没有改变任何东西。什么可能导致这种事情发生?
答案 0 :(得分:83)
您的问题可能正在发生,因为您多次为click事件分配相同的处理程序。我建议您检查分配处理程序的行未被无意中多次调用。另一个解决方案可能是先调用unbind
(已弃用3.0)或off
(取代):
$("#myButton").unbind("click").click(myHandler); // deprecated
$("#myButton").off("click").click(myHandler); // superseeded
但是没有看到一些代码,我只是在猜测。
答案 1 :(得分:13)
鉴于您没有提供大量信息,我建议的最好的方法是查看一个()
答案 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)
答案 5 :(得分:3)
这样会很好用。 它适合我。
DependencyProperty.UnsetValue
答案 6 :(得分:1)
答案 7 :(得分:1)
模态对话框窗口出了问题。每次在会话中打开对话框时,事件都会触发一次。第一个窗口没问题,第二个窗口触发两次,第三个窗口触发三次等等。
我发现每次在同一会话中打开一个新的对话框窗口时,都会调用该对话框的初始化函数。我添加了一个全局变量notInit = -1,并在运行init时将值赋值为1。我在运行init函数之前检查了notInit的值,如果值为-1,则只进行init。