This question was already asked here a long time ago:
Detect jquery event trigger by user or call by code
But it has never been answered conclusively (or maybe I'm simply not able to search properly).
Is it possible to detect whether a scroll
event has been triggered by the user or by the jQuery animate
function?
I am trying to prevent the scroll
event to trigger itself while doing something like this:
$(document).scroll(function(){
$("html").stop(true);
var number = 400; //some other stuff is happening here
clearTimeout(tout);
tout = setTimeout(function(){
if(top == $(document).scrollTop()){
$("html").animate({
scrollTop: (number),
easing: "easeInQuad",
duration: 110
});
}
},120);
});
This code seems to be suitable:
$('#scroller').scroll(function(e) {
if (e.originalEvent) {
console.log('scroll happen manual scroll');
} else {
console.log('scroll happen by call');
}
});
But the originalEvent
object isn't able to detect the animate trigger properly.
Is there any other way to do this?
Using @Tony's accepted answer and @DanielTonon's comment I came up with the following solution:
This seems to solve the issue mentioned whereby jquery removes the
.is(':animated')
then scrolls one more pixel, which leads to.is(':animated')
ending on a false. By storing the second to last version of.is(':animated')
you can be (more) sure whether or not the scroll was an animated one or not.When you want to know if the scroll was animated or not just check the
lastAnimatedScroll
variable.This has NOT been thoroughly tested by me but has been correct on many page refreshes so I will assume it works well enough.
Maybe
:animated
selector will help you:Demo
I would suggest First of all create a javascript function
then, use either
Or
In This scroll event is a function
I don't know how well this works with touch screen devices but this works for me on desktop at least
I don't think there is a way to only target the animated scroll (the accepted answer didn't work for me).
UPDATE: Warning!
Unfortunately,
'mousewheel'
doesn't seem to pick up on users who manually grab the scroll bar and drag it or users who use the scroll bar arrow buttons :(This still works ok for touch screen devices as their swipes seem to count as mouse scrolls. This isn't a great solution for desktop users though.