防止事件处理程序排队



>我正在使用"One"来连接点击处理程序。

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

前任:

$("#button").one("click", function () {
            //run logic
});

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

我假设"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 树中冒泡,则可能涉及其他处理程序)。到那时,在这两种情况下,处理程序都将被删除。

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