所以我有一个滚动事件。它可以解决一些问题,以确定是否应该在页面上移动某些内容。向下滚动时会触发。如果你向下滚动,拖动,它会发射数量惊人的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。
所以对我的问题...... 我可以从特定的事件处理程序中删除以前对我的方法的调用吗?有什么方法可以干扰这个排队/并行运行的进程“ “这样当新的一个被添加到堆栈中时,旧的会立即终止吗?我确信这是一种兼容并行的措辞,但我无法想到它。
*至少我认为就是这种情况 - 如果计算在之前的运行中花费的时间更长,那么他们的动画可能是最后一个被调用的动画,并且可能会使整个运行失效!嗯。在考虑之前我没想过。立即停止前一次迭代的另一个原因!
答案 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);