我正在使用“One”来连接点击处理程序。防止事件处理程序排队
Jquery的“one”方法会连接事件处理程序,并在第一次调用后将其分离,但似乎如果您只是点击足够快,可能会有多个事件处理程序排队并导致回调运行更多比一次。
例:
$("#button").one("click", function() {
//run logic
});
如何防止这种行为。我假设“One”会在第一次运行后分离处理程序,但如果在运行回调时单击该按钮,是否有理由认为它会再次运行?
我正在使用“One”来连接点击处理程序。防止事件处理程序排队
Jquery的“one”方法会连接事件处理程序,并在第一次调用后将其分离,但似乎如果您只是点击足够快,可能会有多个事件处理程序排队并导致回调运行更多比一次。
例:
$("#button").one("click", function() {
//run logic
});
如何防止这种行为。我假设“One”会在第一次运行后分离处理程序,但如果在运行回调时单击该按钮,是否有理由认为它会再次运行?
我假设“一号”将运行它的第一次
不是真的分离后的处理程序,.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树,可能涉及其他处理程序)。到那时候,这两种情况下处理程序都将被删除。
+1,这是真的,但它不应该有所作为。即使处理程序在其执行过程中重新触发事件,新事件的实际处理也不会发生,直到当前处理程序返回并且原始事件完全解决(可能涉及其他处理程序(如果事件允许冒泡DOM树)。到那时候,这两种情况下处理程序都将被删除。 –
@FrédéricHamidi好点..谢谢。 –
感谢您的满足感 – TGH
其浏览器中你看到的这种行为?这应该是不可能的。编辑:是的,我不能复制这个。你确定这是你所有的代码吗? – Esailija
我在IE浏览器中使用IE浏览器模式运行。我可以在我的假设是错误的,但它似乎理论上是可能的.. – TGH
理论是,UI和JavaScript运行在同一个线程,所以下一个排队点击事件发生时,JavaScript已完全执行其响应第一次点击,其中包括删除处理程序。 – Esailija