2012-06-11 105 views
2

我正在使用“One”来连接点击处理程序。防止事件处理程序排队

Jquery的“one”方法会连接事件处理程序,并在第一次调用后将其分离,但似乎如果您只是点击足够快,可能会有多个事件处理程序排队并导致回调运行更多比一次。

例:

$("#button").one("click", function() { 

      //run logic 

}); 

如何防止这种行为。我假设“One”会在第一次运行后分离处理程序,但如果在运行回调时单击该按钮,是否有理由认为它会再次运行?

+1

其浏览器中你看到的这种行为?这应该是不可能的。编辑:是的,我不能复制这个。你确定这是你所有的代码吗? – Esailija

+0

我在IE浏览器中使用IE浏览器模式运行。我可以在我的假设是错误的,但它似乎理论上是可能的.. – TGH

+2

理论是,UI和JavaScript运行在同一个线程,所以下一个排队点击事件发生时,JavaScript已完全执行其响应第一次点击,其中包括删除处理程序。 – Esailija

回答

4

我假设“一号”将运行它的第一次

不是真的分离后的处理程序,.one将运行处理函数之前分离的事件处理程序。如果您查看.one源代码,则会在调用处理函数之前触发.off

if (one === 1) { 
    origFn = fn; 
    fn = function (event) { 
     jQuery().off(event); //Your event is unregistered here 
     return origFn.apply(this, arguments); //Your handler is called 
    }; 
    fn.guid = origFn.guid || (origFn.guid = jQuery.guid++); 
} 

正如弗雷德里克·哈米迪在他的评论中指出,

即使处理器重新触发其执行过程中的情况下,不会发生新的事件的实际操作,直到目前的处理程序后,已经返回并且原始事件完全解决(如果事件被允许冒泡DOM树,可能涉及其他处理程序)。到那时候,这两种情况下处理程序都将被删除。

证明:http://jsfiddle.net/skram/abcvW/2/

+1

+1,这是真的,但它不应该有所作为。即使处理程序在其执行过程中重新触发事件,新事件的实际处理也不会发生,直到当前处理程序返回并且原始事件完全解决(可能涉及其他处理程序(如果事件允许冒泡DOM树)。到那时候,这两种情况下处理程序都将被删除。 –

+0

@FrédéricHamidi好点..谢谢。 –

+0

感谢您的满足感 – TGH

相关问题