如何区分手动滚动(通过鼠标滚轮/滚动条)从一个JavaScript / jQuery滚动?

更新:

这是一个展示问题的jsbin例子 。

更新2:
这里是固定的版本感谢fudgey 。


基本上,我有以下的JavaScript滚动窗口到页面上的一个锚点:

// get anchors with href's that start with "#" $("a[href^=#]").live("click", function(){ var target = $($(this).attr("href")); // if the target exists: scroll to it... if(target[0]){ // If the page isn't long enough to scroll to the target's position // we want to scroll as much as we can. This part prevents a sudden // stop when window.scrollTop reaches its maximum. var y = Math.min(target.offset().top, $(document).height() - $(window).height()); // also, don't try to scroll to a negative value... y=Math.max(y,0); // OK, you can scroll now... $("html,body").stop().animate({ "scrollTop": y }, 1000); } return false; }); 

它完美的工作……直到我手动尝试滚动窗口。 当滚动条或滚轮滚动时,我需要停止当前滚动animation…但我不知道如何做到这一点。

这可能是我的出发点…

 $(window).scroll(e){ if(IsManuallyScrolled(e)){ $("html,body").stop(); } } 

…但我不知道如何编码IsManuallyScrolledfunction。 我在Google Chrome的控制台和AFAIK中检查了eevent对象),但没有办法区分手动滚动和jQuery的animate()滚动。

如何区分手动滚动和通过jQuery的$.fn.animate函数调用的滚动?

试试这个function:

 $('body,html').bind('scroll mousedown wheel DOMMouseScroll mousewheel keyup', function(e){ if ( e.which > 0 || e.type == "mousedown" || e.type == "mousewheel"){ $("html,body").stop(); } }) 

另外,你看到这个教程 ?

更新:现在的浏览器现在使用“wheel”作为事件,所以我已经将它包含在上面的代码中。

我几天前有过同样的问题。如果你想获得这个结果,你不应该使用jquery的animation函数,你必须使用轮询函数来模拟animation。

当我调用ScrollDown.slow()时,我创build了这个应该提供平滑滚动条的类

 ScrollDown.current=$(window).scrollTop(); ScrollDown.lastValue; ScrollDown.lastType; ScrollDown.enabled=true; ScrollDown.custom=function(value,rate){ //let's say value==='bottom' and rate=10 if(value==='bottom'){ value=$(document).height()-$(window).height(); } ScrollDown.current=$(window).scrollTop(); ScrollDown.lastValue=value; (function poll(){ setTimeout(function(){ var prev=$(window).scrollTop(); //This is the critical part /*I'm saving again the scroll position of the window, remember 10 ms have passed since the polling has started At this rate, if the user will scroll up for down pre!==ScrollDown.current And that means I have to stop scrolling.*/ ScrollDown.current++; //increasing the scroll variable so that it keeps scrolling $(window).scrollTop(ScrollDown.current); if(ScrollDown.current<ScrollDown.lastValue && ScrollDown.enabled){ //ScrollDown.current<ScrollDown.lastValue basically checks if it's reached the bottom if(prev!==ScrollDown.current-1){ /*I'm checking if the user scrolled up or down while the polling has been going on, if the user scrolls up then prev<ScrollDown.current-1, if the user scrolls down then prev>ScrollDown.current-1 and at the next poll() the scrolling will stop because ScrollDown.enabled will bet set to false by ScrollDown.stop()*/ ScrollDown.stop(); } poll(); } },rate); })(); }; ScrollDown.stop=function(){ ScrollDown.enabled=false; }; ScrollDown.continue=function(){ ScrollDown.enabled=true; switch (ScrollDown.lastType){ case "fast": ScrollDown.fast(ScrollDown.lastValue); break; case "normal": ScrollDown.normal(ScrollDown.lastValue); break; case "slow": ScrollDown.slow(ScrollDown.lastValue); break; } }; ScrollDown.fast=function(value){ if(!ScrollDown.enabled){ ScrollDown.continue(); }else{ ScrollDown.lastType='fast'; ScrollDown.custom(value,1); } }; ScrollDown.normal=function(value){ if(!ScrollDown.enabled){ ScrollDown.continue(); }else{ ScrollDown.lastType='normal'; ScrollDown.custom(value,10); } }; ScrollDown.slow=function(value){ if(!ScrollDown.enabled){ ScrollDown.continue(); }else{ ScrollDown.lastType='slow'; ScrollDown.custom(value,50); } }; function ScrollDown(){} 

所以,如果你打电话给ScrollDown.slow('bottom'),它会慢慢地开始滚动,直到它到达你的页面底部,除非你手动向上或者向下滚动,然后停止。

你可以设置一个variables来表明你对animate的调用是活动的,然后检查滚动处理程序中的variables。

 window.IsAutoScrolling = true; $("html,body").stop().animate({ "scrollTop": y }, 1000); // Do something to set IsAutoScrolling = false, when the animation is done. $(window).scroll(e){ if(!window.IsAutoScrolling){ $("html,body").stop(); }