it-roy-ru.com

javaScript: обнаружить конец прокрутки

У меня есть слой div с overflow установлен в scroll

Когда прокручивается до нижней части div, я хочу запустить функцию.


56
Zebra

Принятый ответ был в корне ошибочным, с тех пор он был удален. Правильный ответ:

function scrolled(e) {
  if (myDiv.offsetHeight + myDiv.scrollTop >= myDiv.scrollHeight) {
    scrolledToBottom(e);
  }
}

Протестировал это в Firefox, Chrome и Opera. Оно работает.

91
Bjorn Tipling

Хорошо, вот хорошее и правильное решение

У вас есть вызов Div с id="myDiv"

так что функция идет.

function GetScrollerEndPoint()
{
   var scrollHeight = $("#myDiv").prop('scrollHeight');
   var divHeight = $("#myDiv").height();
   var scrollerEndPoint = scrollHeight - divHeight;

   var divScrollerTop =  $("#myDiv").scrollTop();
   if(divScrollerTop === scrollerEndPoint)
   {
       //Your Code 
       //The Div scroller has reached the bottom
   }
}
6
maxspan

Я не смог заставить ни один из приведенных выше ответов работать, поэтому вот третий вариант, который мне подходит! (Это используется с JQuery)

if (($(window).innerHeight() + $(window).scrollTop()) >= $("body").height()) {
    //do stuff
}

Надеюсь, это кому-нибудь поможет!

6
just_user

Это сработало для меня: 

$(window).scroll(function() {
  buffer = 40 // # of pixels from bottom of scroll to fire your function. Can be 0
  if ($(".myDiv").prop('scrollHeight') - $(".myDiv").scrollTop() <= $(".myDiv").height() + buffer )   {
    doThing();
  }
});

Должен использовать JQuery 1.6 или выше

4
AlexQueue

Я нашел альтернативу, которая работает.

Ни один из этих ответов не сработал для меня (в настоящее время проводится тестирование в FireFox 22.0), и после долгих исследований я нашел, как представляется, гораздо более чистое и прямолинейное решение.

Реализованное решение:

function IsScrollbarAtBottom() {
    var documentHeight = $(document).height();
    var scrollDifference = $(window).height() + $(window).scrollTop();
    return (documentHeight == scrollDifference);
}

Ресурс: http://jquery.10927.n7.nabble.com/How-can-we-find-out-scrollbar-position-has-reached-at-the-bottom-in-js-td145336.html

С уважением

3
Chandler Zwolle

Я создал решение на основе событий, основанное на ответе Бьорна Типлинга:

(function(doc){
    'use strict';

    window.onscroll = function (event) {
        if (isEndOfElement(doc.body)){
            sendNewEvent('end-of-page-reached');
        }
    };

    function isEndOfElement(element){
        //visible height + pixel scrolled = total height 
        return element.offsetHeight + element.scrollTop >= element.scrollHeight;
    }

    function sendNewEvent(eventName){
        var event = doc.createEvent('Event');
        event.initEvent(eventName, true, true);
        doc.dispatchEvent(event);
    }
}(document));

И вы используете событие, как это:

document.addEventListener('end-of-page-reached', function(){
    console.log('you reached the end of the page');
});

Кстати: вам нужно добавить этот CSS для JavaScript, чтобы знать, как долго страница 

html, body {
    height: 100%;
}

Демоверсия: http://plnkr.co/edit/CCokKfB16iWIMddtWjPC?p=preview

1
Pylinux

Поскольку innerHeight не работает в некоторых старых IE версиях, clientHeight можно использовать:

$(window).scroll(function (e){
    var body = document.body;    
    //alert (body.clientHeight);
    var scrollTop = this.pageYOffset || body.scrollTop;
    if (body.scrollHeight - scrollTop === parseFloat(body.clientHeight)) {
        loadMoreNews();
    }
});
0
Rado

Посмотрите на этот пример: MDN Element.scrollHeight

Я рекомендую проверить этот пример: stackoverflow.com/a/24815216 ..., который реализует кросс-браузерную обработку для действия прокрутки.

Вы можете использовать следующий фрагмент:

//attaches the "scroll" event
$(window).scroll(function (e) {
    var target = e.currentTarget,
        scrollTop = target.scrollTop || window.pageYOffset,
        scrollHeight = target.scrollHeight || document.body.scrollHeight;
    if (scrollHeight - scrollTop === $(target).innerHeight()) {
      console.log("► End of scroll");
    }
});
0
jherax