On Scroll在页面刷新时自动触发

时间:2015-12-04 18:26:39

标签: javascript jquery

因为我有一个锚,我在我的页面中间。我还有一个窗口滚动事件:

$(window).scroll(function(){
});

刷新页面时,会触发滚动事件。有没有办法在刷新时阻止这种情况,但在用户滚动时仍然会监听滚动事件?

2 个答案:

答案 0 :(得分:3)

我相信只有在刷新页面并滚动页面时才会触发滚动代码。那是因为浏览器会重新加载页面,然后滚动到原始位置。

Arnelle建议的解决方案效果不佳,因为只有在刷新页面时滚动事件才会触发滚动事件。

黑客警报

我发现确实有效的是等待设置滚动处理程序。小心,我使用的魔法数字可能不适用于所有连接。

//Scroll the page and then reload just the iframe (right click, reload frame)


//Timeout of 1 was not reliable, 10 seemed to be where I tested it, but again, this is not very elegant.
//This will not fire initially
setTimeout(function(){
  $(window).scroll(function(){
     console.log('delayed scroll handler');
  }); 
}, 10); 

//This will fire initially when reloading the page and re-establishing the scroll position
$(window).scroll(function(){
  console.log('regular scroll handler');
});
div {  
  height: 2000px;
  border: 1px solid red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
</div>

是的,我知道我对Arnelle说他们在没有理解的情况下修补了一个问题,我在这里,建议一个补丁。唯一的区别是我认为我理解这个问题。

我对OP的主要问题是。如果多次调用,我编写的大多数滚动处理程序工作正常,处理程序被称为额外时间的问题是什么?

答案 1 :(得分:1)

您可以使用标志变量来检测滚动事件是否是初始滚动事件,有效地停止回调函数在页面重新加载时对滚动事件的执行。

var initialScrollEvent = true;

$(window).scroll(function() {
  if (!initialScrollEvent) {
    // callback function body
  }
  initialScrollEvent = false;
});