2015-09-04 34 views
1

我需要檢查用戶是否滾動到頁面上的列表項目<li>的末尾。當發生這種情況時,我想執行一個AJAX調用。當滾動到最後li時檢測到

如何知道用戶是否滾動到最後一個列表項。

這是我到現在爲止所嘗試過的。

if ($('li:last').is(':visible')) { 
    alert('Scrolled to last li'); 
} 

但是,不幸的是它不工作。

+0

這可能會幫助你http://stackoverflow.com/questions/29891587/check-if-element-is-between-30-and-60-of-the-viewport/29892258#29892258 – Tushar

回答

1

您可以使用這樣的功能:

function isElementVisible(elem) 
{ 
    var $elem = $(elem); 
    var $window = $(window); 

    var docViewTop = $window.scrollTop(); 
    var docViewBottom = docViewTop + $window.height(); 

    var elemTop = $elem.offset().top; 
    var elemBottom = elemTop + $elem.height(); 

    return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop)); 
} 

並處理滾動事件:

$(document).ready(function(){ 
    $(window).scroll(function(){ 
    var e = $('#yourContiner ul li:last'); 
    if (isElementVisible(e)) { 
     alert('visible'); 
    } 
    }) 
}) 
+0

一個小問題。當最後的li可見時,這會提醒2次。爲什麼? –

+0

由於滾動事件。當每個像素滾動時,事件被觸發,可能比按時顯示警報更多。您可以使用變量進行控制,該變量可以在元素第一次可見時進行設置。 –

+0

我做了一個簡單的jsfiddle來解決多次發射事件的問題:http://jsfiddle.net/ehta1x3e/ –

1

您不能檢查元素是否爲visible,因爲即使元素不在視口中仍然可見。

從jQuery的文檔:如果他們消耗的文件空間

元素被認爲是可見的。可見元素的寬度或高度大於零。

調整了我的其他answer一點點。

Demo

$(document).ready(function() { 
 
    // Get window height, and the bottom of the viewport 
 
    var windowHeight = $(window).height(), 
 
    gridTop = windowHeight * .1, 
 
    gridBottom = windowHeight + $('ul li:last').height(); 
 

 

 
    // On each scroll event on window 
 
    $(window).on('scroll', function() { 
 

 
    // Interested element caching 
 
    var $lastElement = $('ul li:last'); 
 
    // Get elemets top 
 
    var thisTop = $lastElement.offset().top - $(window).scrollTop(); 
 

 

 
    // Check if the element is in the current viewport 
 
    if (thisTop > gridTop && (thisTop + $lastElement.height()) < gridBottom) { 
 
     $('#message').text('Yay! In sight'); 
 
     $lastElement.addClass('middleviewport'); 
 
    } else { 
 
     $('#message').text('Still not available'); 
 
     $lastElement.removeClass('middleviewport'); 
 
    } 
 
    }); 
 
});
#message { 
 
    position: fixed; 
 
    top: 0; 
 
    text-align: center; 
 
    z-index: 2; 
 
    background: yellow; 
 
    padding: 10px; 
 
    width: 100%; 
 
    color: red; 
 
} 
 
ul { 
 
    margin: auto; 
 
} 
 
ul li { 
 
    width: 300px; 
 
    height: 10px; 
 
    background: #f5f5f5; 
 
    float: left; 
 
    margin: 10px; 
 
} 
 
ul li.middleviewport { 
 
    background: red; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script> 
 
<div id="message">Still not available</div> 
 
<ul> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
    <li></li> 
 
</ul>