Как Gmail обрабатывает назад / вперед в богатом JavaScript?

Gmail, кажется, имеет какой-то умный способ обработки кнопок "назад" / "вперед" в многофункциональном приложении JS.

В моей организации мы опробовали плагин истории jQuery. Плагин в основном запускает функцию каждые 100 мс, которая анализирует URL и проверяет, изменился ли он. История отслеживается с помощью якорей HTTP, и если якорь изменился, то плагин вызывает указанный пользователем обратный вызов, передавая новый якорь, чтобы страница могла выполнять пользовательское поведение для загрузки нового контента.

Моя организация определила, что плагин истории JQuery не был производственным качеством. Я не виню их, если честно, потому что вы не хотите, чтобы браузеры ваших пользователей запускали функцию каждые 100 мс. Кроме того, это делало код JS практически невозможным для отладки, потому что нажатие "Разбить на следующее" в Firebug или аналогичном отладчике JS всегда будет перехватывать событие истории jQuery, и никакие другие события не будут видны.

Таким образом, мы отказались от реализации функции возврата / пересылки в браузере. Однако недавно я заметил, что Gmail реализует это довольно хорошо. Он также использует значение привязки HTTP, но я нажал "Break On Next", и Gmail не запускает никаких функций каждые 100 мс. Как Gmail удается реализовать это поведение назад / вперед?

2 ответа

Решение

Возможно, вы говорите о плагине jQuery History здесь: http://www.balupton.com/projects/jquery-history который использовался на многих сайтах по качеству продукции; один из моих любимых - http://wbhomes.com.au/

Если это так, он использует тест 200 мс для браузеров старого поколения, которые не реализуют onhashchange Событие изначально. Без этого события, реализованного изначально, вы должны обойти его функциональность, используя изменение интервала - просто нет другого пути, насколько мне известно. К счастью, последние версии всех основных браузеров теперь поддерживают событие onhashchange, поэтому эта проверка больше не нужна.

Но, увы, давайте перейдем к тому, что делает эта проверка с интервалом 200 мс. Если они работают в IE6 или 7, он будет проверять состояние iframe (как в этих браузерах iframe требуется для эмуляции кнопок "назад" и "вперед" - где для других браузеров iframe не требуется). Если они используют другой старый браузер, который не является IE, то он может просто использовать location.getHash() в чеке (без фрейма, как описано выше). Оба типа проверок спроектированы так, чтобы быть чрезвычайно быстрыми и минимально возможными, сводя к минимуму необходимые накладные расходы. Все дело в том, что браузер на самом деле хочет вам позволить, и пытается сделать это с использованием наименее интенсивного кода.

Примечание. До выпуска jQuery History до финальной версии v1.4.2 (12 августа 2010 г.) единственными признанными браузерами, которые изначально поддерживали onhashchange, был IE8 и выше. Это было решено во всех более новых версиях проекта jQuery History.

Вы можете проверить этот предыдущий вопрос:

Есть ли способ поймать событие кнопки возврата в JavaScript?

Кажется, что способ, которым это делается в jQuery, является единственным способом сделать это, потому что это то, что делает и YUI:

http://developer.yahoo.com/yui/history/

Другие вопросы по тегам