2013-03-02 125 views
1

我工作的Infinite Load(如延遲加載)來加載類型的功能,這裏是迄今爲止功能:在jQuery的工作在無限負載並不能得到負載的功能只有一次

$(window).scroll(function() { 
     var ScrollPosition = $(window).scrollTop() + $(window).height(); 
     var LoadMorePosition = $(document).height()-100; 
     if(ScrollPosition == LoadMorePosition) { 
      console.log('loading more'); 
      loadMoreItems(); 
     } 
    }); 

這是大部分人工作,除了一旦人員滾動到閾值時,loadMoreItems功能被稱爲20-30次。

我在想一個setTimeout類型的東西可能會工作,但第二個想到我意識到它只會在Ajax內容加載速度足夠快(這是不能保證的)時才起作用。

我需要的是一種方法來檢測他們是否達到閾值,然後只調用一次函數,直到他們再次達到滾動閾值。

回答

1

你可以做這樣的:

var loadOnce = function(fn) { 
    var loadedPages = {}; 
    return function(page) { 
    var key = 'p'+page; 
    if (typeof loadedPages[key] === 'undefined') { 
     fn.apply(fn, arguments); 
     loadedPages[key] = true; 
    } 
    }; 
}; 

var loader = loadOnce(function(page) { 
    /* Ajax Request */ 
}); 

// Will only fire the ajax request once: 
loader(1); 
loader(1); 
loader(1); 
loader(1); 
0

我在想一個setTimeout類型的東西可能會工作,但第二個想到我意識到它只會在Ajax內容加載速度足夠快(這是不能保證的)時才起作用。

然後不要依賴超時,而是重置AJAX請求的success \ complete標誌。

+0

我能想到的唯一辦法像這樣做是因爲全局Javascript變量,但我聽說那些是不好的。這是唯一的選擇嗎? – Talon 2013-03-02 22:45:22

+0

@Talon,只要你控制它們,那些並不是那麼糟糕。無論如何,你可以爲你的變量創建一個「命名空間」(谷歌它)或保存在一個隱藏的輸入標誌。 – gdoron 2013-03-03 04:33:37

0

AJAX調用的成功部分要設置負載更多的內容標誌,所以你不加載更多,如果你沒有更多的。

而對於滾動,用戶停止時,檢測設置超時滾動,然後執行顯示加載GIF和做AJAX操作成功,隱藏GIF,並加載更多:d

$(window).scroll(function(){ 
    clearTimeout(scrolled); 
    scrolled = setTimeout(function(){ 
    //Your function when user stops scrolling 
    }, 100); 
});