JavaScript scroll () событие бесконечный цикл при прокрутке страницы вниз - PullRequest
0 голосов
/ 23 октября 2019

Я создал страницу, где каждый div анимируется, как только окно достигает его, когда пользователь прокручивает страницу. Я использовал jQuery для обработки события scroll().

Моя анимация изменяет ширину divs. Проблема в том, что когда я достигаю конца страницы, происходят странные вещи: событие scroll() запускается само по себе в бесконечном цикле, каждый раз прокручивая страницу немного вверх. Как это исправить?

<html>
<head>
    <meta charset="UTF-8">
    <script src="jquery-3.3.1.min.js"></script>
</head>
<body>

<div class='fadein' data-fadewidth='1em' id='1'>
Div 1
Long text so that the animation can be seen
</div>

<div class='fadein' data-fadewidth='2em' id='2'>
Div 2
Long text so that the animation can be seen
</div>

<div class='fadein' data-fadewidth='3em' id='3'>
Div 3
Long text so that the animation can be seen
</div>

<div class='fadein' data-fadewidth='4em' id='4'>
Div 4
Long text so that the animation can be seen
</div>

<div class='fadein' data-fadewidth='5em' id='5'>
Div 5
Long text so that the animation can be seen
</div>

<br/>

<style>
div {
    margin-bottom: 30%;
}
</style>

<script>

$(document).ready(function() {

    var refresh = function(cls) {

        $(cls).each( function(el) {
            var bottom_of_object = $(this).offset().top + $(this).outerHeight();
            var bottom_of_window = $(window).scrollTop() + $(window).height();

            var delay = 0;
            var time = 2000;

            var animation = {};

            if ($(this).data('fadewidth') != undefined) {
                animation.width = $(this).data('fadewidth');
            }

            if( bottom_of_window > bottom_of_object - ($(window).height()*0.25) ) {

                setTimeout(function () {
                    $(this).animate(animation, time);
                }.bind(this), delay);

            }
        });
    };

    $(window).scroll(function() {
        console.log(Date(), ' page scrolled ');
        refresh('.fadein')});

    refresh('.fadein');

});

</script>

</body>
</html>

Описанное поведение было протестировано в: Firefox 69.0.3 и Chromium 77.0.3865.120 в GNU / Linux 4.19.69-1-MANJARO

1 Ответ

0 голосов
/ 23 октября 2019

Я немного изменил твой код. это содержимое вашего тега script:

<script>

$(document).ready(function() {

    var scrollHandler = function () {
        console.log(Date(), ' page scrolled ');
        refresh('.fadein');
    };

    function refresh(cls) {

        if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight) {
            // you're at the bottom of the page, so remove the event handler.
            $(window).off("scroll", scrollHandler);
        }
        $(cls).each( function(el) {
            var bottom_of_object = $(this).offset().top + $(this).outerHeight();
            var bottom_of_window = $(window).scrollTop() + $(window).height();

            var delay = 0;
            var time = 2000;

            var animation = {};

            if ($(this).data('fadewidth') != undefined) {
                animation.width = $(this).data('fadewidth');
            }

            if( bottom_of_window > bottom_of_object - ($(window).height()*0.25) ) {

                setTimeout(function () {
                    $(this).animate(animation, time);
                }.bind(this), delay);

            }
        });
    };



    $(window).scroll(scrollHandler);


    refresh('.fadein');

});

</script>

Я удаляю обработчик событий, когда пользовательская прокрутка достигает нижней части страницы.

Но в вашем коде по-прежнему есть некоторые проблемы:

if( bottom_of_window > bottom_of_object - ($(window).height()*0.25) ) {

    setTimeout(function () {
        $(this).animate(animation, time);
    }.bind(this), delay);

}

Здесь вы устанавливаете эту анимацию слишком много раз, чтобы даже после того, как пользователь достигнет дна и удалил обработчик событий, анимации по-прежнему остаются для выполнения.

Это происходит потому, что вы уже установили ихдо. Так что, если вы подождете некоторое время, когда все будет выполнено, страница перестанет прокручиваться вверх.

Обратите на это внимание и измените способ настройки анимации таким образом, чтобы она выполнялась только для одного деления за раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...