2013-01-10 42 views
1

底部的刷新触发两次我有一个无限的滚动与下面的一段代码设置。无限滚动从第

$(window).scroll(function() { 
    if ($(window).scrollTop() >= $("#home_content").height() - $(window).height()) { 
     if (isLastPage) { 
      foo(); 
     } else { 
      bar(); // JQuery AJAX call 
     } 
    } 
}); 

这是在document.ready()中; 服务器为最后一页发送标志时,不会发生ajax调用。这在正常情况下正常工作。但是当我从页面底部按下F5(刷新)时,会触发两个同时滚动事件,并绕过该标志(因为即使在设置标志之前第二次调用也会发生)并且加载了重复数据。

我知道的唯一事情是它发生在document.ready()函数的末尾。任何人,任何想法?

在此先感谢。

编辑

没有比这更相关的代码等。

而这仅仅发生在FF 17 在IE 9的时候我做了快速向下滚动,同样的滚动触发了两次

+0

可能重复? http://stackoverflow.com/questions/10727002/jquery-document-ready-fires-twice – Stevie

+0

你看起来很好,但没有看到更多的代码,很难诊断原因! – Stevie

+0

@Stevie:它不是document.ready(),它被触发两次,但window.scroll。 – shazinltc

回答

1

这仅仅是一个解决方法,因为我们不能看到你的完整代码,但也许这就是能帮助:

var timeout; 

$(window).scroll(function(){ 
     clearTimeout(timeout); 
    timeout = setTimeout(function(){ 
     if ($(window).scrollTop() >= $("#home_content").height() - $(window).height()){ 
       if (isLastPage){ 
        foo(); 
       }else{ 
        bar();//AJAX call 
       } 
      } 
    },0); 
}); 
+0

对不起,但这没有奏效。 – shazinltc

+0

做了一个小改动。将延迟增加到100毫秒。现在在所有浏览器中都很好用。谢谢:)顺便说一句,让我知道如果有任何警告,如果我这样做。 – shazinltc

+0

你解决了它man(y)并且已经为问题海报添加了书签问题。 – NullPointer

2

您可以对所有类型的事件调用使用此去抖动例程。清洁和可重复使用。

// action takes place here. 
function infinite_scrolling(){ 
    if ($(window).scrollTop() >= $("#home_content").height() - $(window).height()) { 
     if (isLastPage) { 
      foo(); 
     } else { 
      bar(); // JQuery AJAX call 
     } 
    } 
} 

// debounce multiple requests 
var _scheduledRequest = null; 
function infinite_scroll_debouncer(callback_to_run, debounce_time) { 
    debounce_time = typeof debounce_time !== 'undefined' ? debounce_time : 800; 
    if (_scheduledRequest) { 
     clearTimeout(_scheduledRequest); 
    } 
    _scheduledRequest = setTimeout(callback_to_run, debounce_time); 
} 

// usage 
$(document).ready(function() { 
    $(window).scroll(function() { 
     infinite_scroll_debouncer(infinite_scrolling, 1000); 
    }); 
});