Firefox прокруткаОсновная проблема

У меня проблема со значением Firefox scrollTop и событием onscroll. Это отлично работает в IE, Safari и Chrome, но Firefox, кажется, отстает.

Я попытался обновить некоторую фоновую позицию с помощью события onscroll, но когда я беру ручку и быстро перетаскиваю ее вверх и вниз, Firefox перестает обновлять значение scrollTop, и это вызывает некоторую задержку в моем приложении.

Вы можете попробовать этот код и посмотреть в консоли Firefox при перетаскивании дескриптора, и вы увидите значения, которые что-то останавливает обновление:

function SaveScrollLocation () {
    console.log(document.documentElement.scrollTop);
}

window.onscroll=SaveScrollLocation ;

Есть идеи, как заставить Firefox реагировать быстрее?


person user621950    schedule 17.02.2011    source источник


Ответы (4)


Есть два способа справиться с этим - дросселирование (выполнение функции с заданным интервалом) и устранение дребезга (выполнение функции по прошествии указанного времени с момента последнего вызова). Вы, вероятно, захотите использовать дросселирование в вашей ситуации.

Упрощенное решение может выглядеть примерно так (Обновлено: см. его по адресу http://jsfiddle.net/yVVNU/1/):

    window.onscroll=catchScroll;
    var timeOutId = 0;
    var jitterBuffer = 200;
    function catchScroll()
        {
            if (timeOutId) clearTimeout (timeOutId);
            timeOutId = setTimeout(function(){SaveScrollLocation()}, jitterBuffer);
        }

    function SaveScrollLocation () {
        console.log(document.documentElement.scrollTop);
        alert('scrolled');
    }

Вы также можете использовать этот подключаемый модуль jQuery: http://benalman.com/projects/jquery-throttle-debounce-plugin/

person unclenorton    schedule 17.02.2011
comment
+1 за ссылку на плагин. Этот jsfiddle, похоже, не делает хороших дел, но что там :) - person Ryley; 18.02.2011
comment
Это потому, что я забыл закомментировать строку console.log(document.documentElement.scrollTop);, что вызывает ошибку, потому что console.log не определен. - person unclenorton; 18.02.2011
comment
Плагин дроссельной заслонки jquery, кажется, то, что я ищу. Большое спасибо! - person user621950; 18.02.2011
comment
Хороший ответ. Это помогло мне с моим вопросом, связанным с Иваном Караджасом: предупреждать о проблеме с прокруткой. Спасибо. - person CaptainBli; 27.04.2012

$(window).scrollTop() работал на меня

person Lasithds    schedule 26.06.2013

Разве поведение быстрого перетаскивания окна вверх и вниз не будет считаться ненормальным?

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

Не могли бы вы с помощью небольшой магии setTimeout обойти эту проблему И сделать свой скрипт немного легче в пользовательском интерфейсе браузера, не запуская SaveScrollLocation до тех пор, пока он не очистит местоположение прокрутки, которое СТОИТ сохранить?

person Chris Baker    schedule 17.02.2011
comment
это действительно помогает с текущей политикой предотвращения прокрутки Firefox - person hsrv; 24.10.2019

Firefox не запускает (или не использовал) событие onscroll так часто, как другие браузеры. см. здесь

Интересно, что scrollTop обновляется с правильной частотой, поэтому вы, вероятно, можете использовать другое событие, такое как mousemove. Я сделал что-то вроде этого:

при первом событии прокрутки начните прослушивать события перемещения мыши - обновляйте все, что хотите, на основе scrollTop, которое обновляется правильно. По истечении короткого тайм-аута после onscroll прекратите прослушивание событий перемещения мыши.

person Woody    schedule 28.04.2012