2015-09-04 5 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

Небольшая проблема. Это предупреждает 2 раза, когда отображается последний li. Зачем? –

+0

Из-за события прокрутки. Когда каждый пиксель прокручивается, событие запускается и, вероятно, отображает предупреждение больше, чем вовремя. Вы можете управлять с помощью переменной tha, которая может быть установлена ​​при первом просмотре вашего элемента. –

+0

Я сделал простой jsfiddle, чтобы решить проблему с многократным запуском события: http://jsfiddle.net/ehta1x3e/ –

1

Вы не можете проверить, является ли элемент visible, потому что даже если элемент отсутствует в области просмотра, он все еще отображается.

С Jquery Docs:

Элементы считаются видимыми, если они потребляют пространство в документе. Видимые элементы имеют ширину или высоту, которая больше нуля.

Изменил мой другой 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>

Смежные вопросы