2012-07-01 73 views
2

我想有一个事件处理程序只执行一次,然后从绑定到的所有元素解除绑定。jquery事件处理程序只执行一次绑定到多个元素

我知道.one(),但是在使用它时“处理程序每​​个元素最多执行一次”。

是否有一种“内置”方式将事件处理程序绑定到多个元素,并在它们中的任何一个上执行后自动从所有元素中移除它?

回答

1

简单。只需在回调函数内解除绑定事件处理程序。就像这样:

$('p').on('click', function(){ 
    alert('I appear only one time'); 
    $('p').off('click'); // Removes the event. So, it will never be executed again. 
}) 

该脚本将删除类型点击的所有事件,这是一个有点aggresive。有关更多信息,请参阅offunbind的文档。

+0

工作这样势必导致在某些时候有些麻烦。 如果我将不得不手动执行此操作,我会编写一个.once(处理程序),它将同时保留指向“this”和处理程序的指针,并绑定另一个处理程序,该处理程序将仅删除它添加的处理程序。这只是我希望JQuery已经有这样的东西... – epeleg

+0

在这种情况下,我不知道任何现有的jquery函数,就像那样。 这种方法对我来说似乎不是很容易出错,但实现一个附加第二个事件的jquery _fn.once()_函数可能会很复杂。您必须关注事件优先级,使用_stopPropagation_的事件可能不会被解除绑定....似乎更复杂的是只需在您的回调函数中添加一行。 –

+0

接受为“我不知道任何现有的jquery函数,就像那样工作”... – epeleg

0

miguel camba已经告诉你检查维基解除绑定。正确的解决方案如下:

var handler = function() { 
     alert('I appear only one time'); 
     $('p').unbind('click', handler); 
    } 
    $('p').bind('click', handler); 

这将只从click事件中解除绑定此处理程序。

//编辑:

另一种解决办法是命名空间点击事件:

$('p').bind('click.myClickEvent', function() { 
    alert('I appear only one time'); 
    $('p').unbind('click.myClickEvent'); 
}); 
+0

我喜欢使用闭包的第一种方法。至于第二种解决方案,对于我的口味而言,它仍然不觉得“可重入”,因为如果我将它放在一个函数中,该函数将警报作为参数进行调用,那么多次调用该函数将仅使单个警报开始触发而不是每次调用该函数的一次警报。 – epeleg

+0

可以使用.on()和.off()来实现第一个解决方案吗? – epeleg

+0

我想这几乎是一样的 –

相关问题