Проблема Firefox с scrollTop - PullRequest
       27

Проблема Firefox с scrollTop

2 голосов
/ 17 февраля 2011

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

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

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

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

window.onscroll=SaveScrollLocation ;

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

Ответы [ 5 ]

4 голосов
/ 17 февраля 2011

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

Упрощенное решение может выглядеть примерно так ( Обновлено : см. 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/

2 голосов
/ 26 июня 2013

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

1 голос
/ 29 апреля 2012

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

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

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

0 голосов
/ 17 февраля 2011
var last = +new Date;

function SaveScrollLocation () {
    var now = +new Date;
    if (now - last > 50) {
      // ...
      last = now;
    }
}

window.onscroll = SaveScrollLocation ;
0 голосов
/ 17 февраля 2011

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

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

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

...