2010-06-01 112 views
8

我有一个ajax应用程序,将运行每个交互功能。我希望能够每次运行我的设置功能,以便我的所有设置代码保持封装。然而,绑定元素不止一次意味着处理程序将运行多次,这显然是不可取的。有没有一种优雅的方式在jQuery中多次调用一个元素上的绑定而不会多次调用这个处理函数?在jQuery中,有没有办法只绑定一次点击?

回答

8

你可以用one()功能的事件附加到document

$(document).one('click', function(e) { 
    // initialization here 
}); 

一旦运行,该事件处理程序再次删除,因此不会再次运行。但是,如果您需要初始化以在之前运行某个其他元素的点击事件,我们将不得不考虑其他元素。然后,使用mousedown而不是click可能会奏效,因为mousedown事件在点击事件之前触发。

+0

你错过了'';'在那里。 – Ben 2010-06-01 04:14:02

+0

谢谢本,修理... – 2010-06-01 04:15:36

+0

不知道这个。 – DMin 2010-06-01 04:27:31

12

用户jQuery one函数像Tom说的那样,但是每次绑定之前都要绑定处理程序。它有助于将事件处理程序分配给一个变量,而不是使用匿名函数。

var handler = function(e) { // stuff }; 

$('#element').unbind('click', handler).one('click', handler); 

//elsewhere 
$('#element').unbind('click', handler).one('click', handler); 

您还可以做.unbind('click')删除所有附加到元素的点击处理程序。

1

Chetan Sastry的答案就是你想要的。基本上只需调用$(元素).unbind(event);在每个事件之前。

所以,如果你有一个像loadAllButtonClicks(功能),它包含所有你的页面上的每个按钮的

$(element).on("click", function(){}); 

方法,并在运行,每一个按钮被点击的时间,这显然会产生超过每个按钮一个事件。为了解决这个问题之前每

$(element).on("click", function(){}); 

添加

$(element).unbind(event); 

,它会解除绑定所有事件到该元素,然后添加一个click事件。

2

如果解除绑定不起作用,也可以使用.off()。确保给.off选择和事件最初提供的。对()中的那些完全一致:

$("div.selector").off("click", "a.another_selector");  
$("div.selector").on("click", "a.another_selector", function(e){ 

这是我在解决同阿贾克斯重装问题什么工作。

+0

我喜欢这个,因为$(元素).unbind(event);解决方案将从元素中删除所有类型的事件(例如点击),而这种方法只是删除与所选择的问题相关的事件,即使它们共享相同的事件类型,也会留下其他事件。 – 2015-01-18 17:06:02

相关问题