Предотвратить вызов всех прошлых путевых точек jQuery при добавлении новых путевых точек

Я использую плагин jQuery Waypoints для динамической загрузки следующей статьи в серии, когда читатель приближается к конец текущей статьи. Таким образом, одна путевая точка запускает этот запрос ajax.

У меня также есть путевая точка, прикрепленная к элементу-оболочке каждой статьи, которая срабатывает как когда статья приближается к верхней части экрана (при прокрутке вниз), так и когда она появляется примерно на полпути к экрану (при прокрутке вверх) — эти функции обновляют заголовок и URL страницы в адресной строке.

Все это работает, но я обнаружил, что когда я загружаю несколько статей, когда обновляются путевые точки (как это происходит при добавлении новой путевой точки), активируются все путевые точки предыдущих статей, поэтому я могу видеть строка заголовка быстро пробегает по всем предыдущим заголовкам/URL.

Я думал, что добавление continuous: false к .entry-wrapper путевым точкам исправит это (из документации;: «если false, это сработает, только если это последняя путевая точка»), но, увы, это не так.

Любые идеи? Код следует:

/*
    Load the next entry via AJAX when we near the end of each entry 
*/
$('.load-trigger').waypoint(
    function()
    {
        url = $('.load-next:last').data('url');
        if(url)
        {
            $.get(url, function(data)
            {
                /*
                    We only want the content    
                */
                entry = $(data).find('.entry-wrapper').hide();
                /*
                    Add it to the DOM   
                */
                $('.content').append(entry);
                /*
                    Fade-in 
                */
                $(entry).fadeIn(500, function()
                {
                    /*
                        When scrolling down, push a new history state when the new entry reaches the top of the window  
                    */
                    $('.entry-wrapper').waypoint(function(direction)
                    {
                        if(direction === 'down')
                        {
                            history.pushState('', $(this).data('title'), $(this).data('url'));
                            document.title = $(this).data('title');
                        }
                    },
                    {
                        continuous: false,
                        offset: '100px'
                    });
                    /*
                        When scrolling back up, push a new history state when the previous entry is filling roughly half of the window
                        (see offset)
                    */
                    $('.entry-wrapper').waypoint(function(direction)
                    {
                        if(direction === 'up')
                        {
                            history.pushState('', $(this).data('title'), $(this).data('url'));
                            document.title = $(this).data('title');
                        }
                    },
                    {
                        continuous: false,
                        offset: function(){ return ($(this).height() * -1) + ($.waypoints('viewportHeight') / 2) }
                    });
                });
            });
        }
    },
    {
        offset: '120%'
    }
);

Упрощенная разметка:

<div class="content">
    <div class="entry-wrapper" data-title="Foo baz bar" data-url="http://foo.bar/bing>
        ...
        <div class="load-next" data-url="http://foo.bar/baz"></div>
    </div>
</div>
<div class="load-trigger"></div>

person Derek Hogue    schedule 21.02.2014    source источник


Ответы (1)


Обнаружена моя ошибка: я добавлял путевые точки, связанные с историей, к каждой предыдущей записи каждый раз, когда загружалась новая запись ($('.entry-wrapper').waypoint(function(direction)...). Вместо этого мне нужно было быть конкретным:

/*
    When scrolling down, push a new history state when the new entry reaches the top of the window  
*/
$(entry).waypoint(function(direction)
{
    if(direction === 'down')
    {
        history.pushState('', $(this).data('title'), $(this).data('url'));
        document.title = $(this).data('title');
    }
},
{
    continuous: false,
    offset: '100px'
});
/*
    When scrolling back up, push a new history state when the previous entry is filling roughly half of the window
    (see offset)
*/
$(entry).waypoint(function(direction)
{
    if(direction === 'up')
    {
        history.pushState('', $(this).data('title'), $(this).data('url'));
        document.title = $(this).data('title');
    }
},
{
    continuous: false,
    offset: function(){ return ($(this).height() * -1) + ($.waypoints('viewportHeight') / 2) }
});
person Derek Hogue    schedule 22.02.2014