如何在jQuery中中断先前的事件触发器

时间:2013-11-24 14:19:16

标签: javascript jquery

所以我有一个滚动事件。它可以解决一些问题,以确定是否应该在页面上移动某些内容。向下滚动时会触发。如果你向下滚动,拖动,它会发射数量惊人的bazillions。正如您所期望的那样,也许吧。这是一些简单的虚拟代码来表示事件的顺序。

function scroller() {
    // 1. A really expensive calculation that depends on the scroll position
    // 2. Another expensive calculation to work out where should be now
    // 3. Stop current animations
    // 4. Animate an object to new position based on 1 and 2
}
$(window).on('resize' scroller);

不要误解我的意思,它通常准确所以没有那么多的并发问题。我的动画里面事件调用.stop()(作为第3部分)所以最新的版本总是*正确的,但它占用了大量的CPU。我想在这里成为一个负责任的开发人员,而不是期望每个用户都拥有四核i7。

所以对我的问题...... 我可以从特定的事件处理程序中删除以前对我的方法的调用吗?有什么方法可以干扰这个排队/并行运行的进程“ “这样当新的一个被添加到堆栈中时,旧的会立即终止吗?我确信这是一种兼容并行的措辞,但我无法想到它。

*至少我认为就是这种情况 - 如果计算在之前的运行中花费的时间更长,那么他们的动画可能是最后一个被调用的动画,并且可能会使整个运行失效!嗯。在考虑之前我没想过。立即停止前一次迭代的另一个原因!

1 个答案:

答案 0 :(得分:2)

您可以确保每x毫秒最多触发一次事件。 E.g:

(function ($) {
    $.fn.delayEvent = function (event, callback, ms) {
        var whichjQuery = parseFloat($().jquery, 10)
            , bindMethod = whichjQuery > 1.7 ? "on" : "bind"
            , timer = 0;
        $(this)[bindMethod](event, function (event) {                   
            clearTimeout (timer);
            timer = setTimeout($.proxy(callback, this, event), ms);
        });
        return $(this);
    };
})(jQuery);

$(window).delayEvent("resize", scroller, 1000);

简约演示: http://jsfiddle.net/karim79/z2Qhz/6/