窗口滚动事件触发两次

14

无论我使用什么方法检测页面滚动,事件都会被触发两次。请查看我尝试的不同方法的代码。

<body onmousewheel="alert('Why are you alerting twice?')">
或者
<script src="js/jquery-1.8.3.min.js"></script>
<script>
$(window).scroll(function(){
    alert("Why are you alerting twice?");
});
</script>
或者
window.onscroll = please_scroll;

function please_scroll() {
      alert("Why are you alerting twice?");
    }

我甚至尝试使用$.debounce。

如果有用的话,我将解释一下我正在尝试做什么: 当用户向上或向下滚动滚轮时,页面将动画滚动到下一个全宽内容div。 我已经编写了在单击菜单时成功执行此操作的代码,但我还希望它发生在用户滚动时,从而自动帮助他们滚动到页面的每个部分。这是我目前用于滚动的函数:

function scrollTo(id){
  // Scroll
  $('html,body').animate({scrollTop: $("#"+id).offset().top - 110},'slow',function(){
    animation_active = "false";
  });
}

首先,应该是:window.onscroll = please_scroll; 其次,你不应该使用 alert 来调试事件。 - A. Wolff
好的,鼠标滚轮和其他HID设备(如苹果鼠标)在使用时可以更频繁地触发滚动事件。您需要使用超时来处理这个问题。 - Alex
1个回答

19

许多设备可能会触发滚动事件,导致看起来事件更频繁地发生。只需使用超时处理:

var timeout;

$(window).scroll(function() {
    clearTimeout(timeout);  
    timeout = setTimeout(function() {
        // do your stuff
    }, 50);
});

你可以调整数值为50,我建议在50和150之间选择一个数值。


1
我刚刚花了4个小时来调试这个问题,而你似乎直接解决了我的问题。哇,谢谢! - Iceman3000
1
很高兴能帮忙! :) - Alex
我也是!我没想到需要一个超时,我的问题:http://stackoverflow.com/questions/32383804/why-is-my-eventlistener-getting-called-twice?noredirect=1#comment52639143_32383804 - Leon Gaban
工作正常,但有延迟!不是立即的。 - WantToDo
@WantToDo 将50减少到你喜欢的任何数字。 - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接