如何在JavaScript中以编程方式区分鼠标滚动和滚动?

我通过更改Javascript中的scrollLeft属性来滚动溢出的DIV内容:

setInterval(function(){ $('#scrollbox').scrollLeft($('#scrollbox').scrollLeft()+1); }, 50); 

但是,我想在用户使用鼠标滚动内容后立即停止此操作。 我试图使用scroll事件检测到这一点

 $('#scrollbox').scroll(function(){...}); 

但是,我上面的自动滚动也会触发该事件。 我如何区分这个并且只对用户启动的滚动做出反应? (或者:如何阻止上面的代码触发滚动事件?这也可以解决问题)

当鼠标hover在scrollbox元素上时,您可以使用.hover() :函数停止滚动:

http://jsfiddle.net/bGHAH/1/

 setInterval(function(){ if(!mouseover) { $('#scrollbox').scrollLeft($('#scrollbox').scrollLeft()+1); } }, 50); var mouseover = false; $('#scrollbox').hover(function(){ mouseover = true; },function(){ mouseover = false; }); 

编辑

根据您的评论,我设法从以下站点找到一个jquery插件: jquery的特殊滚动事件 。

此插件包含一个事件,该事件尝试根据最后一个滚动步骤和检查时间之间经过的时间段确定滚动是否已停止。

为了使这个工作起作用,我需要将你的间隔减慢到恰好超过插件使用的延迟,这个延迟时间为310毫秒。 这样做意味着我必须增加滚动步骤以保持其明显移动。

链接在这里:

http://jsfiddle.net/EWACn/1/

这是代码:

 var stopAutoScroll = false; $(document).ready(function(){ setInterval(function(){ if(!stopAutoScroll) { $('#status').html('scrolling'); $('#scrollbox').scrollLeft($('#scrollbox').scrollLeft()+10); }else{ $('#status').html('not scrolling'); } }, 310); $('#scrollbox').bind('scrollstart', function(e){ stopAutoScroll = true; }); $('#scrollbox').bind('scrollstop', function(e){ stopAutoScroll = false; }); }); 

希望这可以帮助。

对于FF(Mozilla):

document.addEventListener('DOMMouseScroll', handler, false);

对于IE,Opera和Chrome:

document.onmousewheel = handler;

另一种选择是在编程滚动之前设置一个外部标志,然后重置后。 如果触发了scroll事件并且未设置此标志,则表示用户负责并可以采取相应措施。

不幸的是,虽然这是独立于浏览器且易于阅读的,但它可能会让您相信某些用户卷轴是程序化的。 但是我认为这种情况的发生很小,可能值得,这取决于你正在编写的应用程序。

为大多数现代浏览器尝试滚轮事件

当旋转指点设备(通常是鼠标)的滚轮按钮时,将触发滚轮事件。