最好的方法是使用超时并在侦听器内部检查超时是否仍然有效:
var timeout = null;
var speed = 100; //ms
var canScroll = true;
$(element).on('DOMMouseScroll mousewheel wheel', function(event) {
// Timeout active? do nothing
if (timeout !== null) {
event.preventDefault();
return false;
}
// Get scroll delta, check for the different kind of event indexes regarding delta/scrolls
var delta = event.originalEvent.detail ? event.originalEvent.detail * (-120) : (
event.originalEvent.wheelDelta ? event.originalEvent.wheelDelta : (
event.originalEvent.deltaY ? (event.originalEvent.deltaY * 1) * (-120) : 0
));
// Get direction
var scrollDown = delta < 0;
// This is where you do something with scrolling and reset the timeout
// If the container can be scrolling, be sure to prevent the default mouse action
// otherwise the parent container can scroll too
if (canScroll) {
timeout = setTimeout(function(){timeout = null;}, speed);
event.preventDefault();
return false;
}
// Container couldn't scroll, so let the parent scroll
return true;
});
您可以将其应用于任何可滚动元素,在我的例子中,我使用了 jQuery 工具可滚动库,但最终对其进行了大量自定义以改进浏览器支持以及添加特定于我的用例的自定义功能。
您需要注意的一件事是确保超时时间足够长,以防止多个事件无缝触发。我的解决方案只有在您想控制元素的滚动速度以及一次应该滚动多少时才有效。如果您添加console.log(event)
到侦听器函数的顶部并使用连续滚动外围设备进行滚动,您将看到许多鼠标滚轮事件被触发。
令人讨厌的是,Firefox 滚动 DOMMouseScroll不会在魔术鼠标或连续滚动设备上触发,而是在具有滚动并通过鼠标滚轮的单击循环停止的普通滚动设备上触发。