/** * jQuery extension, add support `scrollstart` and `scrollend` events. * * @author RubaXa * @github https://gist.github.com/RubaXa/5568964 * @license MIT * * * @settings * $.special.scrollend.delay = 300; // default ms * * @flags * $.isScrolled; // boolean * * @binding * $(window).bind('scrollstart scrollend', function (evt){ * if( evt.type == 'scrollstart' ){ * // logic * } * }); * */ (function ($){ var ns = (new Date).getTime() , special = $.event.special , dispatch = $.event.handle || $.event.dispatch , scroll = 'scroll' , scrollStart = scroll + 'start' , scrollEnd = scroll + 'end' , nsScrollStart = scroll +'.'+ scrollStart + ns , nsScrollEnd = scroll +'.'+ scrollEnd + ns ; special.scrollstart = { setup: function (){ var pid, handler = function (evt/**$.Event*/){ if( pid == null ){ evt.type = scrollStart; dispatch.apply(this, arguments); } else { clearTimeout(pid); } pid = setTimeout(function(){ pid = null; }, special.scrollend.delay); }; $(this).bind(nsScrollStart, handler); }, teardown: function (){ $(this).unbind(nsScrollStart); } }; special.scrollend = { delay: 300, setup: function (){ var pid, handler = function (evt/**$.Event*/){ var _this = this, args = arguments; clearTimeout(pid); pid = setTimeout(function(){ evt.type = scrollEnd; dispatch.apply(_this, args); }, special.scrollend.delay); }; $(this).bind(nsScrollEnd, handler); }, teardown: function (){ $(this).unbind(nsScrollEnd); } }; $.isScrolled = false; $(window).bind(scrollStart+' '+scrollEnd, function (evt/**Event*/){ $.isScrolled = (evt.type == scrollStart); $('body')[$.isScrolled ? 'addClass' : 'removeClass']('is-scrolled'); }); })(jQuery);