我有一个ajax应用程序,可以在每次交互时运行函数。我希望每次都能运行我的设置功能,所以我的所有设置代码都保持封装状态。但是,绑定元素不止一次意味着处理程序将运行多次,这显然是不可取的。在jQuery中是否有一种优雅的方法可以多次调用一个元素上的bind而不会多次调用该处理程序?
答案 0 :(得分: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 :(得分:8)
您可以使用document
功能将事件附加到one()
:
$(document).one('click', function(e) {
// initialization here
});
运行后,将再次删除此事件处理程序,以便它不会再次运行。但是,如果您需要初始化以在之前运行某个其他元素的click事件,我们将不得不考虑其他内容。然后使用mousedown
代替click
可能会有效,因为在点击事件之前触发了mousedown事件。
答案 2 :(得分:2)
如果unbind没有做到这一点,你也可以使用.off()。确保给.off的选择器和事件与最初提供给.on()的选择器和事件完全匹配:
$("div.selector").off("click", "a.another_selector");
$("div.selector").on("click", "a.another_selector", function(e){
这对解决相同的ajax重装问题有用。
答案 3 :(得分:1)
Chetan Sastry的答案就是你想要的。基本上只需调用$(元素).unbind(event);在每个事件之前。
所以如果你有一个像loadAllButtonClicks()这样的函数包含所有的
$(element).on("click", function (){});
页面上每个按钮的方法,并且每次单击按钮时都会运行该方法,这显然会为每个按钮生成多个事件。要解决这个问题,只需添加
即可$(element).unbind(event);
每个
之前$(element).on("click", function (){});
它将取消绑定该元素的所有事件,然后添加一次单击事件。