Как Gmail заставляет IE Back работать без обновления? - PullRequest
16 голосов
/ 10 сентября 2009

Gmail использует #, когда вы нажимаете на почту, чтобы различить страницу (+ действие Ajax). http://mail.google.com/mail/#inbox/1238e709e37a1394

Я нашел: Google использует # вместо поиска? в URL. Почему?

В FF или Chrome вы можете использовать «Вперед» и «Назад» без обновления между URL: http://X.com/MyPage.aspx#1 http://X.com/MyPage.aspx#2 http://X.com/MyPage.aspx#3

Но в IE страница обновляется и она не учитывает параметры после #, когда выполняется обратное действие.

Как Gmail сотворил магию?

Ответы [ 2 ]

13 голосов
/ 10 сентября 2009

Я могу дать вам ответ на этот вопрос, потому что я столкнулся и решил эту проблему.

Сначала нужно понять несколько понятий:

  1. JavaScript не может напрямую изменить историю браузера.
  2. всякий раз, когда базовый URL-адрес iframe на странице изменяется, история обновляется. (но это имеет некоторые странности с разными браузерами).
  3. URL содержит «хэшированную» часть: например, в URL http://mail.google.com/mail#inbox, #inbox - хэшированная часть. Давайте назовем это "хэш". поэтому http://mail.google.com/mail будет нашим «базовым URL».

История отслеживания GMail в основном делается с помощью трюков, основанных на этом "хэше".

Итак, еще несколько понятий:

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

Итак, когда вы переходите с http://mail.google.com/mail#inbox на http://mail.google.com/mail#sent, страница не обновляется .

Теперь, если GMail получит уведомление о событии при изменении хэша, тогда gmail может предпринять действия, основанные на этом. К сожалению, нет событий DOM, которые могли бы помочь нам зафиксировать действия в истории. Таким образом, вместо этого (это часть, которая показывает, как я преодолел проблему), мы запускаем бесконечный цикл, который проверяет изменения в хэше. Если он наблюдает изменение, мы обнаруживаем нажатие кнопки «назад» или «вперед» браузера.

Для решения этой проблемы я создал удобный инструмент: анализатор URL . Он может анализировать GET-параметры в URL, а также параметры, закодированные в Hash. Попробуйте демо-версию!

Ура!


Об этой проблеме в IE: я не осознавал, что это решение, основанное на хэше, не работает в IE (плохой старый разработчик Linux).

Но для IE вы можете использовать скрытый iframe и использовать его свойство "url влияет на историю" для реализации истории. Я знаю, что в этом утверждении отсутствуют детали, но это связано с моим собственным опытом работы с IE.

Я попробую это решение и продолжу:)

В Интернете я нашел множество ссылок, которые правильно реализуют историю, используя хэш iframes / location. У меня не хватило терпения выкопать различия между интерфейсом iframe в разных браузерах.

Полагаю, я бы предпочел плагин jquery . У YUI тоже есть менеджер истории.

Ура!

3 голосов
/ 10 сентября 2009

Это то, что я искал: http://nix.lv/history/demo.html#3

Нашел это на: Сохранить якорь в истории ie6

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...