防止事件处理程序排队

时间:2012-06-11 18:14:53

标签: javascript jquery asp.net

我使用“One”连接点击处理程序。

Jquery的“one”方法将连接一个事件处理程序并在第一次调用后将其分离,但是如果你只是单击足够快,似乎排队多个事件处理程序并导致回调运行超过一旦。

例如:

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

            //run logic

});

如何防止此行为。我假设“One”将在第一次运行它之后分离处理程序,但如果在运行回调时单击该按钮,是否合理地假设它将再次运行?

1 个答案:

答案 0 :(得分:4)

  

我假设“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++);
}

FrédéricHamidi在评论中指出,

  

即使处理程序在执行期间重新触发事件,新事件的实际处理也不会发生,直到当前处理程序返回并且原始事件完全解析为止(如果允许事件,则可能涉及其他处理程序)冒泡DOM树)。到那时,处理程序将在两种情况下都被删除。

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