2011-11-22 160 views
19

我希望在用戶滾動到頁面底部時實現內容加載。JQuery檢測滾動底部

我有問題。它適用於桌面瀏覽器,但不適用於移動設備。我實施了一個骯髒的修復程序,使其在iPhone上工作,但不是最佳的,因爲它不適用於其他大小的移動設備。

我的網站是www.cristianrgreco.com,向下滾動,在行動中看到

問題是添加滾動和高度不等於高度在移動設備上,而他們在桌面瀏覽器做的效果。

有沒有辦法檢測到移動瀏覽器?

在此先感謝。

下面是目前正在使用的代碼:

$(document).ready(function() { 
     $(".main").hide().filter(":lt(3)").show(); 
     if ($(document).height() == $(window).height()) { 
      // Populate screen with content 
     } 
     else if (navigator.userAgent.match(/Android/i) || navigator.userAgent.match(/webOS/i) || navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPod/i)) { 
      window.onscroll = function() { 
       if ($(document).height() - $(window).scrollTop() <= 1278) { 
        // At the moment only works on iPhone 
       } 
      } 
     } 
     else { 
      $(window).scroll(function() { 
       if ($(window).scrollTop() + $(window).height() >= $(document).height()) {      
        // Works perfect for desktop browsers 
       } 
      }) 
     } 
}) 
+0

是節省帶寬的移動設備的目標是什麼? – LamonteCristo

+0

不,目前我有一個JavaScript檢測移動設備的用戶代理,並執行某個代碼,該代碼不是100%,只能在iphone上工作,否則它會執行在所有桌面上都能正常工作的代碼瀏覽器 – Cristian

回答

17

對於任何人誰看這裏後,我解決了這個加height=device-heightmeta視標籤:

<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0"> 

你可以然後繼續使用$(document).scroll(function(){});

這與iOS 5工作

+0

嘿所有,尼克說什麼,我還與插件結合我在下面提到 –

+0

謝謝,我試圖找到一個解決方案這一段時間。這工作。 –

+3

供參考:如果文檔縮小(用戶縮小),jQuery實際上返回$(window).height()的錯誤高度,所以如果它存在,我不得不使用window.innerHeight,否則回落$(window).height() – mltsy

0

您已經添加了iPhone手機的元標籤,該標籤將內容大小到手機的視口?

<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0;"> 

編輯:

所以,我想這是我的手機(Android的薑餅)上的問題是沒有這麼多不工作它顯示的內容不強制頁面滾動的代碼。只要我放大並動態加載更多內容。您可以嘗試添加內容,直到添加的內容大於$(window).height();

+0

我會嘗試添加meta標籤。我已經通過首先檢查$(document).height()== $(window).height()是否已經解決了沒有足夠內容的問題,並且如果是這樣一次加載內容3直到它們不相等 – Cristian

+1

添加meta標籤並不能修復它 – Cristian

1

防彈的方式來獲得文件的高度在所有瀏覽器:

function getDocumentHeight() { 
    return Math.max(
     Math.max(document.body.scrollHeight, document.documentElement.scrollHeight), 
     Math.max(document.body.offsetHeight, document.documentElement.offsetHeight), 
     Math.max(document.body.clientHeight, document.documentElement.clientHeight) 
    ); 
} 
+1

不完全,'Math.max(undefined,5)=== NAN' – qwertymk

+1

@qwertymk我敢肯定,這是一種防彈的方法*在所有瀏覽器上獲取文檔高度*,包括移動瀏覽器。我沒有詳細說明這是一個可以從一堆數字中獲得最大值的防彈方法:)使用Web瀏覽器檢查這個jsFiddle,你將得到正確的數字:http://jsfiddle.net/z5BM8/ – Strelok

3
的偉大工程

如果可以的話,你應該避免嘗試擊中確切的數字。

使用上述Stelok的功能,你可以測試這樣的:

if ($win.height() + $win.scrollTop() > (getDocumentHeight()-10)) { 

這是一個有點軟 - 用戶可能不會很滾動到確切的最後一個像素,但認爲他/她是在底部。

+0

老兄認真,你是我的明星... rockstar ...現在是我的名人。你救了我......感謝(百萬)^百萬。 –

0

下面是其他答案的總和,這對我來說效果很好。它可以在某個時候寫成一個jQuery插件。

// Handles scrolling past the window up or down to refresh or load more data. 
var scrolledPastTop = false; 
var scrolledPastBottom = false; 
var scrollPrevious = 0; 

function getDocumentHeight() { 
    return Math.max(
     Math.max(document.body.scrollHeight, document.documentElement.scrollHeight), 
     Math.max(document.body.offsetHeight, document.documentElement.offsetHeight), 
     Math.max(document.body.clientHeight, document.documentElement.clientHeight) 
); 
} 

function bottomScrollRefresh(callback) { 
    var pastBottom = $window.height() + $window.scrollTop() > getDocumentHeight(); 
    if(!scrolledPastBottom && pastBottom) { 
    callback($window.height() + $window.scrollTop()); 
    scrolledPastBottom = true; 
    } else { 
    if(!pastBottom) scrolledPastBottom = false; 
    } 
    scrollPrevious = $window.scrollTop(); 
} 

function topScrollRefresh(callback) { 
    var pastTop = $window.scrollTop() < scrollPrevious && $window.scrollTop() <= 0; 
    if(!scrolledPastTop && pastTop) { 
    callback($window.scrollTop()); 
    scrolledPastTop = true; 
    } else { 
    if(!pastTop) scrolledPastTop = false; 
    } 
    scrollPrevious = $window.scrollTop(); 
} 

要在代碼中使用這一點,添加這樣的事情:

window.onscroll = function() { 
    topScrollRefresh(function(pos) { 
     console.log("Loading top. " + pos); 
    }); 
    bottomScrollRefresh(function(pos) { 
    console.log("Loading bottom. " + pos); 
    }); 
}; 

我的PhoneGap /科爾多瓦應用程序的偉大工程。

3

一種改進代碼的jQuery的版本

var scrollRefresh = { 
    pastTop: false, 
    pastBottom: false, 
    previous: 0, 
    bottom: function(callback) { 
     var pBottom = $(window).height() + $(window).scrollTop() >= $(document).height(); 
     if(!this.pastBottom && pBottom) { 
     callback($(window).height() + $(window).scrollTop()); 
     this.pastBottom = true; 
     } else { 
     if(!pBottom) this.pastBottom = false; 
     } 
     this.previous = $(window).scrollTop(); 
    }, 
    top: function(callback) { 
     var pTop = $(window).scrollTop() < this.scrollPrevious && $(window).scrollTop <= 0; 
     if(!this.pastTop && pTop) { 
     callback($(window).scrollTop()); 
     this.pastTop = true; 
     } else { 
     if(!pTop) this.pastTop = false; 
     } 
     this.previous = $(window).scrollTop(); 
    } 
    } 

    $(window).scroll(function() { 
    scrollRefresh.top(function(pos) { 
     console.log("Loading top. " + pos); 
     alert("scrolled to top"); //You should delete this line 
    }); 
    scrollRefresh.bottom(function(pos) { 
     console.log("Loading bottom. " + pos); 
     alert("scrolled to bottom"); //You should delete this line 
    }); 
    }); 
+0

此代碼需要進行一些調整才能使其工作...僅供參考。 – hoffmanc

+0

您需要將var pTop替換爲:var pTop = $(window).scrollTop()

1

使用jQuery和下面Strelok的getDocumentHeight()(乾杯! )我發現以下工作非常好。平等的測試並沒有爲我工作的iPhone只能在這實際上比原稿的高度越大,幻燈片結束註冊的滾動值:

$(window).scroll(function() { 
    var docHeight = getDocumentHeight();   
    if ($(window).scrollTop() + $(window).height() >= docHeight) { 
    // Do stuff 
    } 
});