jQuery Infinite Scroll-событие срабатывает несколько раз при быстрой прокрутке

хорошо, код ниже "работает" в том, что при прокрутке до нижней части страницы запускается функция AJAX и результаты добавляются к div #postswrapper на странице.

проблема: если я прокручиваю очень быстро, когда я достигаю нижней части страницы, AJAX срабатывает несколько раз и загружает несколько наборов результатов в # postswrapper div (количество дополнительных, "нежелательных" результатов определяется тем, сколько дополнительных событий прокрутки было запущено прокруткой быстро.)

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

какие идеи?

Я использую jquery.1.4.4.js, если это кому-то поможет. И e.preventDefault () не работает, в этой ситуации, в любом случае.

$(window).scroll(function(e) {
    e.preventDefault();
    if ($(window).scrollTop() >= ($(document).height() - $(window).height())) {
        $('div#loadmoreajaxloader').show();
        $.ajax({
            cache: false,
            url: 'loadmore.php?lastid=' + $('.postitem:last').attr('id'),
            success: function(html) {
                if (html) {
                    $('#postswrapper').append(html);
                    $('div#loadmoreajaxloader').hide();
                } else {
                    $('div#loadmoreajaxloader').html();
                }
            }
        });
    }
});

1 ответов


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

$(window).data('ajaxready', true).scroll(function(e) {
    if ($(window).data('ajaxready') == false) return;

    if ($(window).scrollTop() >= ($(document).height() - $(window).height())) {
        $('div#loadmoreajaxloader').show();
        $(window).data('ajaxready', false);
        $.ajax({
            cache: false,
            url: 'loadmore.php?lastid=' + $('.postitem:last').attr('id'),
            success: function(html) {
                if (html) {
                    $('#postswrapper').append(html);
                    $('div#loadmoreajaxloader').hide();
                } else {
                    $('div#loadmoreajaxloader').html();
                }
                $(window).data('ajaxready', true);
            }
        });
    }
});

прямо перед отправкой запроса Ajax флаг очищается, что означает, что документ не готов к дополнительным запросам Ajax. Как только Ajax завершается успешно, он устанавливает флаг обратно в true, и может быть инициировано больше запросов.