Прежде всего, спасибо вам, ребята, что ответили! знак равно
Теперь я провел гораздо больше исследований и считаю, что доволен своей реализацией. Вот результаты моего исследования.
Прежде всего, моя готовая Hash
библиотека. Это автономная библиотека без зависимостей. Он имеет две функции: Hash.init(callback, iframe)
и Hash.go(newHash)
. Функция обратного вызова вызывается всякий раз, когда хэш изменяется с новым хэшем в качестве первого аргумента, а в качестве второго аргумента — флагом, указывающим, вызывается ли обратный вызов из-за начального состояния (true
) или фактического изменения хэша (false
).
Hash.js (лицензия MIT)
Я также сделал плагин jQuery для упрощения использования. Также добавляет глобальное событие hashchange
. См. пример в исходном коде, как его использовать.
jquery.hash.js (лицензия MIT)
Чтобы увидеть их в использовании, перейдите на мою страницу «области» JavaScript:
Сфера JavaScript от Blixt
Интернет Эксплорер 8
Плавный круиз! Просто примените одно из них onhashchange
к объекту window
(используя attachEvent
) и получите значение location.hash
в обработчике событий.
Не имеет значения, щелкает ли пользователь ссылку с хэшем или вы устанавливаете хэш программно; история сохраняется отлично.
Хром, Фаерфокс, Сафари 3+, Опера 8+
Плавный круиз! Просто опросите об изменениях свойства location.hash
, используя setInterval
и функцию.
История работает идеально. Для Opera я установил history.navigationMode
на 'compatible'
. Честно говоря, я не уверен, что он делает, я сделал это по рекомендации из комментария в коде YUI.
Примечание. Opera нуждается в дополнительном тестировании, но у меня пока все работает нормально.
Причудливый бонус-сюрприз! (Может быть?!) Оказывается, Firefox (подтверждено только в 3.5+) декодирует свойство location.hash
, поэтому это может вызвать событие hashchange
дважды (сначала для закодированной версии, а затем для незакодированной версии). — это новая версия моей библиотеки Hash.js, которая учитывает это, используя вместо этого свойство location.href
(изменения предоставлены Аароном Оглом).
Интернет Эксплорер 6, 7
Теперь становится противнее. История переходов в старых версиях Internet Explorer игнорирует изменения хэша. Чтобы обойти это, общепринятым решением является создание iframe
и установка его содержимого в новый хэш. Это создает новую запись в истории навигации. Когда пользователь возвращается, это изменяет содержимое iframe
на его предыдущее содержимое. Обнаружив изменение содержимого, вы можете получить его и установить в качестве активного хэша.
Проверка изменений свойства location.hash
по-прежнему необходима для ручного изменения текущего адреса. Однако остерегайтесь причуд, о которых я упоминал ниже.
Хотя это решение кажется лучшим, оно все еще не идеально в Internet Explorer 6, что немного странно в отношении кнопок «назад/вперед». Однако Internet Explorer 7 работает нормально.
Неожиданный причудливый бонус №1! В Internet Explorer 6 всякий раз, когда в хэше есть вопросительный знак, он извлекается и помещается в свойство location.search
! Он удален из location.hash
свойства. Однако, если существует реальная строка запроса, location.search
вместо этого будет содержаться именно она, и вы сможете получить полный истинный хеш, только проанализировав свойство location.href
.
Неожиданный причудливый бонус №2! Если установлено свойство location.search
, любые последующие #
персонажи будут удалены из location.href
(и location.hash
) свойство. В Internet Explorer 6 это означает, что всякий раз, когда в пути или хэше есть вопросительный знак, вы столкнетесь с этой особенностью. В Internet Explorer 7 эта особенность возникает только при наличии знака вопроса в пути. Вам нравится единообразие Internet Explorer?
Неожиданный причудливый бонус №3! Если другой элемент на странице имеет тот же идентификатор, что и значение хеша, этот хэш полностью испортит историю. Таким образом, эмпирическое правило заключается в том, чтобы избегать хэшей с тем же идентификатором, что и любые элементы на странице. Если хэши генерируются динамически и могут конфликтовать с идентификаторами, рассмотрите возможность использования префикса/суффикса.
Другие браузеры
Если у вас нет необычной пользовательской базы, вам не нужно будет поддерживать больше браузеров. Браузеры, не перечисленные выше, относятся к категории использования ‹1%.
person
Blixt
schedule
07.07.2009