jQuery ładuje więcej danych na scroll

Zastanawiam się tylko jak Mogę zaimplementować więcej danych na scroll tylko jeśli div.ładowanie jest widoczne.

Zwykle szukamy wysokości strony i wysokości przewijania, aby sprawdzić, czy musimy załadować więcej danych. ale poniższy przykład jest trochę skomplikowany.

Poniższy obraz jest doskonałym przykładem. są dwa .Ładowanie div na rozwijanej skrzynce. Gdy użytkownik przewija zawartość, która jest widoczna, powinien zacząć ładować więcej danych dla to.

Tutaj wpisz opis obrazka

Więc jak mogę się dowiedzieć, czy .Ładowanie div jest widoczne dla użytkownika jeszcze czy nie? Więc mogę zacząć ładować dane tylko dla tego div.

Author: Muhammad Usman, 2012-12-26

9 answers

W jQuery sprawdź, czy trafiłeś na dół strony za pomocą funkcji przewijania. Po naciśnięciu tego, wykonaj połączenie ajax (możesz pokazać ładowanie obrazu tutaj aż ajax odpowiedź) i uzyskać następny zestaw danych, dołączyć go do div. Ta funkcja jest wykonywana podczas ponownego przewijania strony w dół.

$(window).scroll(function() {
    if($(window).scrollTop() == $(document).height() - $(window).height()) {
           // ajax call get data from server and append to the div
    }
});
 305
Author: deepakssn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-06 09:32:36

Czy słyszałeś o wtyczka jQuery Waypoint.

Poniżej znajduje się prosty sposób wywołania wtyczki waypointy i załadowania strony większej zawartości, gdy dotrzesz do dołu na przewijaniu:

$(document).ready(function() {
    var $loading = $("<div class='loading'><p>Loading more items&hellip;</p></div>"),
    $footer = $('footer'),
    opts = {
        offset: '100%'
    };

    $footer.waypoint(function(event, direction) {
        $footer.waypoint('remove');
        $('body').append($loading);
        $.get($('.more a').attr('href'), function(data) {
            var $data = $(data);
            $('#container').append($data.find('.article'));
            $loading.detach();
            $('.more').replaceWith($data.find('.more'));
            $footer.waypoint(opts);
        });
    }, opts);
});
 87
Author: defau1t,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-31 01:37:54

Oto przykład:

  1. przy przewijaniu do dołu, elementy html są dołączane. Ten mechanizm dodawania jest wykonywany tylko dwa razy, a następnie w końcu dołączany jest przycisk z kolorem powderblue.

<!DOCTYPE html>
<html>
<head>
    <title>Demo: Lazy Loader</title>
    <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
    <style>
        #myScroll {
            border: 1px solid #999;
        }

        p {
            border: 1px solid #ccc;
            padding: 50px;
            text-align: center;
        }

        .loading {
            color: red;
        }
        .dynamic {
            background-color:#ccc;
            color:#000;
        }
    </style>
    <script>
		var counter=0;
        $(window).scroll(function () {
            if ($(window).scrollTop() == $(document).height() - $(window).height() && counter < 2) {
                appendData();
            }
        });
        function appendData() {
            var html = '';
            for (i = 0; i < 10; i++) {
                html += '<p class="dynamic">Dynamic Data :  This is test data.<br />Next line.</p>';
            }
            $('#myScroll').append(html);
			counter++;
			
			if(counter==2)
			$('#myScroll').append('<button id="uniqueButton" style="margin-left: 50%; background-color: powderblue;">Click</button><br /><br />');
        }
    </script>
</head>
<body>
    <div id="myScroll">
        <p>
            Contents will load here!!!.<br />
        </p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
        <p >This is test data.<br />Next line.</p>
    </div>
</body>
</html>
 10
Author: Om Sao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-30 16:06:46

Przyjęta odpowiedź na to pytanie ma pewien problem z chrome, gdy okno jest powiększone do wartości >100%. Oto kod zalecany przez programistów chrome jako część błędu, który poruszyłem na tym samym.

$(window).scroll(function() {
  if($(window).scrollTop() + $(window).height() >= $(document).height()){
     //Your code here
  }
});

Dla odniesienia:

Related SO question

Chrome Bug

 10
Author: Prasanth K C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-28 11:44:47

Jeśli nie wszystkie zwoje dokumentu, powiedzmy, gdy masz przewijanie div w dokumencie, to powyższe rozwiązania nie będą działać bez adaptacji. Oto jak sprawdzić, czy pasek przewijania div trafił na dół:

$('#someScrollingDiv').on('scroll', function() {
    let div = $(this).get(0);
    if(div.scrollTop + div.clientHeight >= div.scrollHeight) {
        // do the lazy loading here
    }
});
 8
Author: The Coprolal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-19 11:49:41

Poprawa @ deepakssn odpowiedz. Istnieje możliwość, że chcesz, aby dane załadować bit przed właściwie przewijamy do dno.

var scrollLoad = true;
$(window).scroll(function(){
 if (scrollLoad && ($(document).height() - $(window).height())-$(window).scrollTop()<=800){
    // fetch data when we are 800px above the document end
    scrollLoad = false;
   }
  });

[var scrollLoad] jest używany do blokowania wywołania, dopóki nie zostaną dodane nowe dane.

Mam nadzieję, że to pomoże.
 3
Author: Moonis Abidi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-22 12:49:12

Proponuję użyć więcej matematyki.ceil, aby uniknąć błędu na jakimś ekranie.
Ponieważ na kilku różnych ekranach nie jest to absolutnie dokładne
Zdałem sobie z tego sprawę, kiedy pocieszałem.log.

console.log($(window).scrollTop()); //5659.20123123890  

I

console.log$(document).height() - $(window).height()); // 5660

Więc myślę, że powinniśmy edytować Twój kod do

$(window).scroll(function() {
    if(Math.ceil($(window).scrollTop()) 
       == Math.ceil(($(document).height() - $(window).height()))) {
           // ajax call get data from server and append to the div
    }
});

Lub Zezwalaj na ładowanie danych z serwera przed przewijaniem do dołu.

if ($(window).scrollTop() >= ($(document).height() - $(window).height() - 200)) {
 // Load data
}
 2
Author: Thanh Nguyen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-07 08:25:10

Spędziłem trochę czasu próbując znaleźć ładną funkcję do owinięcia rozwiązania. W każdym razie skończyło się na tym, co uważam za lepsze rozwiązanie podczas ładowania wielu treści na jednej stronie lub w całej witrynie.

Function:

function ifViewLoadContent(elem, LoadContent)
    {
            var top_of_element = $(elem).offset().top;
            var bottom_of_element = $(elem).offset().top + $(elem).outerHeight();
            var bottom_of_screen = $(window).scrollTop() + window.innerHeight;
            var top_of_screen = $(window).scrollTop();

            if((bottom_of_screen > top_of_element) && (top_of_screen < bottom_of_element)){
            if(!$(elem).hasClass("ImLoaded"))   {
                $(elem).load(LoadContent).addClass("ImLoaded");
            }
            }
            else {
               return false;
            }
        }

Możesz następnie wywołać funkcję za pomocą window on scroll (na przykład, możesz również powiązać ją z kliknięciem itp. tak jak i ja, stąd Funkcja):

Do użycia:

$(window).scroll(function (event) {
        ifViewLoadContent("#AjaxDivOne", "someFile/somecontent.html"); 

        ifViewLoadContent("#AjaxDivTwo", "someFile/somemorecontent.html"); 
    });

To podejście powinno działać również przy przewijaniu div itp. Mam nadzieję, że to pomoże, w powyższym pytaniu można użyć tego podejścia do załadowania treści w sekcjach, może dołączyć i tym samym dribble feed wszystkie dane obrazu, a nie bulk feed.

Użyłem tego podejścia, aby zmniejszyć koszty na https://www.taxformcalculator.com . umarł sztuczka, jeśli spojrzeć na stronę i sprawdzić element itp. możesz zobaczyć wpływ na ładowanie strony w Chrome(jako przykład).

 1
Author: Pete - iCalculator,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-02 13:15:54

Twoje pytanie dotyczy wczytywania danych Kiedy div wpadnie do widoku , a nie kiedy użytkownik dotrze do końca strony.

Oto najlepsza odpowiedź na twoje pytanie: https://stackoverflow.com/a/33979503/3024226

 0
Author: Ihsan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-29 07:30:37