【问题标题】:Fire event after scrollling scrollbars or mousewheel with javascript使用 javascript 滚动滚动条或鼠标滚轮后触发事件
【发布时间】:2012-02-14 10:33:13
【问题描述】:

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

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

似乎jQuery's .scroll() 在每次用户滚动时都会触发,而且一直触发事件似乎很笨拙。是否有 .onScrollAfter() 之类的东西,是 .onMouseUp() 的同义词?

我想知道在不使用框架的情况下这是否可行(或者函数是否已经存在),尽管我会考虑一个;尤其是jQuery

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

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

    示例(概念代码):

    (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<thingey.length; i++) {
                thingey[i](ev);
            }
        }
        // Add listener
        window.addScrollListener = function(fn) {
            if (typeof fn  === 'function') {
                thingey.push(fn);
            } else {
               throw TypeError('addScrollListener: First argument must be a function.');
            }
        }
        window.removeScrollListener = function(fn) {
            var index = thingey.indexOf(fn);
            if (index !== -1) thingey.splice(index, 1);
        }
    })();
    

    【讨论】:

      【解决方案2】:

      我想我会添加这个作为答案,即使它很旧。我相信您尝试重新创建的事件是debounce 的同义词。这在underscore.js 中可用

      debounce_.debounce(函数,等待,[立即]) 创建并返回传递函数的新去抖动版本,该版本将推迟其执行,直到自上次调用以来等待毫秒过去后。对于实现仅在输入停止到达后才应发生的行为很有用。例如:渲染 Markdown 注释的预览、窗口停止调整大小后重新计算布局等等。

      所以它会在您最后一次执行特定事件后等待。如果您不想延迟,您可以指定 0。David Walsh has a pretty nice implementation 您可以包含在任何项目中。

      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);
      

      【讨论】:

        【解决方案3】:

        说明

        您可以使用出色的 jQuery 插件 James Padoley 为 jQuery 提供的特殊滚动事件

        真的很棒。

        查看页面和jsFiddle Demonstration(只需滚动;))

        更多信息

        【讨论】:

        • demo 可以在 IE8 原生中甚至工作。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-26
        相关资源
        最近更新 更多