2017-05-07 55 views
0

我使用wheelDelta检查滚动方向,但它一次返回大量的滚动属性。我只需要知道它是否已启动或关闭,并且在第一次触发后它不应该在500毫秒内返回一个值。我试图玩setTimeout,但不能很好地解决它。有任何想法吗?jQuery功能 - 阻止获得回报“一段时间”

var distance = $('.section-two').offset().top, 
    $window = $(window); 

    $window.scroll(function() { 
     if ($window.scrollTop() >= distance) { 
      $('body').css('overflow', 'hidden'); 
      setTimeout(function(){ 
       $(document).bind('mousewheel', function(evt) { 

        var delta = evt.originalEvent.wheelDelta; 
        if(delta > 0){ 

         console.log('scrolled up') 
        } else { 
         console.log('scrolled down'); 
        } 
       }) 
      }, 500); 
     } 
    }); 

enter image description here 这里的codepen example

回答

1

能您尝试之前解除绑定'mousewheel'事件绑定。它似乎是,它一遍又一遍地绑定它。在$(document).bind('mousewheel', function(evt) {行之前添加$(document).unbind('mousewheel');

+0

感谢乌米特,它实际上有点帮助,但无法解决问题。我还将示例上传到了CodePen:https://codepen.io/cangoktas/pen/wdPYEy –

+0

随着解除绑定,它将在鼠标滚轮的每个勾号中返回1个结果。这是听众'鼠标滚轮'可以获得的最低结果。如果你想让它工作的话;在拖动鼠标滚轮而不重置它的情况下,它只返回一个结果,您应该考虑更改事件侦听器。编辑CodePen:https://codepen.io/anon/pen/vmWVVg –

+0

我想我有点整理出来setTimeout:https://codepen.io/cangoktas/pen/LyOgqN再次感谢,iyi geceler :) –

0

尝试使用Lodash来限制事件。你应该能够存储先前偏移,并计算出从滚动方向:

var lastScrollTop = 0; 
 

 
function scrollHandler() { 
 
    var scrollTop = window.pageYOffset || document.documentElement.scrollTop; 
 

 
    if (scrollTop > lastScrollTop){ 
 
     console.info('scrolled down'); 
 
    } else { 
 
     console.info('scrolled up'); 
 
    } 
 
    
 
    lastScrollTop = scrollTop; 
 
} 
 

 
window.addEventListener('scroll', _.throttle(scrollHandler, 500))
<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"></script>

+0

谢谢,试过Lodash但我禁用滚动溢出:隐藏;然后尝试检测滚动检测,所以Lodash无法检测到它。 –

+1

在这种情况下,请参阅http://stackoverflow.com/questions/8378243/catch-scrolling-event-on-overflowhidden-element。 – Conan

0

一个更合适的setTimeout解决:codepen example

var doMouseWheel = true; 
       $(document).bind("mousewheel", function(event, delta) 
       { 
         // it'll just not do anything while it's false 
         if (!doMouseWheel) 
          return; 

         // here's where you were unbinding, now just turning false 
         doMouseWheel = false; 

         // do whatever else you wanted 
         var delta = event.originalEvent.wheelDelta; 
         if(delta > 0){ 
          console.log('scrolled up') 
         } else { 
          console.log('scrolled down'); 
         } 

         // here's where you were rebinding, now wait 200ms and turn on 
         setTimeout(turnWheelBackOn, 800); 
       }); 

       function turnWheelBackOn() { doMouseWheel = true; }