使用javascript滚动滚动条或鼠标滚轮后的火灾事件

我想知道是否可以在滚动页面后使用滚动条或鼠标滚轮(或在触摸设备上轻扫)时触发事件。

基本上,我想检测用户何时停止滚动,以便我可以加载AJAX,而不是在滚动时加载。

似乎jQuery's .scroll()每次用户滚动时都会触发,而且一直有事件触发似乎很笨拙。 有没有.onScrollAfter() ,与.onScrollAfter()同义吗?

我想知道这是否可能(或者如果函数已经存在)而不使用框架,尽管我会考虑一个; 特别是jQuery

此事件不存在。 您可以使用超时来模拟它:

示例(概念代码):

 (function() { var timer; /* Basic "listener" */ function scroll_finish(ev) { clearTimeout(timer); timer = setTimeout(scroll_finished, 200, ev); //200ms. Too small = triggered too fast. Too high = reliable, but slow } window.onscroll = scroll_finish; // Or addEventListener, it's just a demo // Fire "events" var thingey = []; function scroll_finished(ev) { // Function logic for (var i=0; i 

我以为我会把它作为答案添加,即使它已经过时了。 您尝试重新创建的事件我认为是debounce同义词。 这可以在underscore.js中找到

debounce_.debounce(function,wait,[immediate])创建并返回传递函数的新去抖版本,该版本将推迟执行,直到自上次调用后经过等待毫秒数。 用于实现仅在输入停止到达后才会发生的行为。 例如:呈现Markdown注释的预览,在窗口停止resize后重新计算布局,等等。

所以它会在你上次执行特定事件后等待。 如果你不想要延迟,你可以指定0. David Walsh有一个非常好的实现,你可以包含在任何项目中。

 function debounce(func, wait, immediate) { var timeout; return function() { var context = this, args = arguments; var later = function() { timeout = null; if (!immediate) func.apply(context, args); }; var callNow = immediate && !timeout; clearTimeout(timeout); timeout = setTimeout(later, wait); if (callNow) func.apply(context, args); }; }; 

通过这样做你可以继续添加

 var myEfficientFn = debounce(function() { // All the taxing stuff you do }, 250); window.addEventListener('scroll', myEfficientFn); 

描述

您可以使用James Padoley的 jQuery插件特别滚动事件为jQuery

工作真的很棒。

看看页面和这个jsFiddle演示 (只是滚动;))

更多信息

  • jQuery的特殊滚动事件
  • jsFiddle示范