Хранение истории хеша/привязки изменяется в JavaScript

Да. Это похоже на различие между городской тюрьмой и дверью. Эти ManualResetEvent дверь, которая должна быть закрыта (сброс) вручную. Эти AutoResetEvent городская тюрьма, позволяя одному автомобилю пройти и автоматически закрываясь, прежде чем следующий сможет пройти.

28
задан Matthias Ronge 26 July 2013 в 06:04
поделиться

3 ответа

Прежде всего, спасибо вам, ребята, которые ответили! =)

Я провел много дополнительных исследований и считаю, что доволен своей реализацией. Вот результаты моих исследований.

Прежде всего, моя законченная Hash библиотека . Это автономная библиотека без зависимостей. Он имеет две функции: Hash.init (обратный вызов, iframe) и Hash.go (newHash) . Функция обратного вызова вызывается всякий раз, когда хеш изменяется с новым хешем в качестве первого аргумента, а в качестве второго аргумента - флаг, указывающий, вызывается ли обратный вызов из-за начального состояния ( истина ) или фактического изменения в hash ( false ).

Hash.js (лицензия MIT)

Я также сделал плагин jQuery, чтобы упростить его использование. Также добавляет глобальное событие hashchange . См. Пример в исходном коде, чтобы узнать, как его использовать.

jquery.hash.js (лицензия MIT)

Чтобы увидеть их в использовании, перейдите на мою страницу "область" JavaScript:

область JavaScript Blixt

Internet Explorer 8

Smooooth cruisin '! Просто подключите одно из событий onhashchange к объекту window (используя attachEvent ) и получите местоположение . значение hash в обработчике событий.

Не имеет значения, щелкает ли пользователь ссылку с хешем или вы устанавливаете хеш программно; история хранится отлично.

Chrome, Firefox, Safari 3+, Opera 8+

Плавный ход! Просто запросите изменения в свойстве location.hash , используя setInterval и функцию.

История работает отлично. Для Opera я установил history.navigationMode на 'совместимый' . Честно говоря, я не уверен, что он делает, я сделал это по рекомендации из комментария в коде YUI.

Примечание : Opera нуждается в дополнительном тестировании, но пока что у меня все работает нормально.

Бонус-сюрприз! (Неужели?!) Оказывается, Firefox (подтвержденный только в 3.5+) декодирует свойство location.hash , так что это может вызвать событие hashchange дважды (сначала для закодированной версии, затем для незашифрованной). Существует новая версия моей библиотеки Hash.js, которая учитывает это, используя местоположение Вместо этого свойство .href (изменения предоставлены Аароном Оглом.)

Internet Explorer 6, 7

Теперь становится еще хуже. История переходов в старых версиях Internet Explorer игнорирует изменения хешей. Чтобы обойти эту проблему, общепринятое решение - создать iframe и установить для его содержимого новый хэш. Это создает новую запись в истории навигации. Когда пользователь возвращается, это изменяет содержимое iframe на его предыдущее содержимое. Обнаружив изменение содержимого, вы можете получить его и установить в качестве активного хэша.

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

Хотя это решение кажется лучшим из существующих, оно все еще не идеально в Internet Explorer 6, что немного странно в отношении кнопок назад / вперед. Однако Internet Explorer 7 работает нормально.

Бонус-сюрприз №1! В Internet Explorer 6 всякий раз, когда в хэше стоит вопросительный знак, он извлекается и помещается в location.search свойство! Он удален из свойства location.hash . Однако, если есть реальная строка запроса, location.search будет содержать ее вместо этого, и вы сможете получить полный истинный хэш только путем анализа location.href свойство.

Бонус за сюрприз # 2! Если локация . Если установлено свойство search , любые последующие символы # будут удалены из свойства location.href location.hash ). В Internet Explorer 6 это означает, что всякий раз, когда в пути или хэше стоит вопросительный знак, вы столкнетесь с этой странностью. В Internet Explorer 7 эта странность возникает только тогда, когда в пути стоит вопросительный знак. Разве вам не нравится согласованность в Internet Explorer?

Бонус-сюрприз № 3! Если другой элемент на странице имеет тот же идентификатор, что и значение хэша, этот хеш полностью испортит историю. Итак, эмпирическое правило - избегать хэшей с тем же идентификатором, что и у любых элементов на странице. Если хэши генерируются динамически и могут конфликтовать с идентификаторами, рассмотрите возможность использования префикса / суффикса.

Другие браузеры

Если у вас нет необычной базы пользователей, вам не нужно будет поддерживать больше браузеров. Браузеры, не указанные выше, относятся к категории использования <1%.

32
ответ дан 28 November 2019 в 03:39
поделиться

Я не уверен, что полностью понимаю ваши потребности, но я использовал действительно простой Библиотека истории ( http://code.google.com/p/reallysimplehistory/ ) для реализации чего-то подобного. Вы можете увидеть это здесь: http://whiteoak.sourceforge.net/

1
ответ дан 28 November 2019 в 03:39
поделиться

На основании усилий, которые вы вложили в это, я предполагаю, что вы: мы видели YUI Browser History Manager , но на всякий случай ...

Они хорошо описывают свою реализацию, и я считаю, что их исходный код очень удобочитаем.

Вот что в нем говорится. Opera

* location.hash is a bit buggy on Opera. I have seen instances where
* navigating the history using the back/forward buttons, and hence
* changing the URL, would not change location.hash. That's ok, the
* implementation of an equivalent is trivial ... more below

В поисках источника я также нашел несколько вариантов для Safari 1.x и 2.0. Похоже, вам это будет интересно.

Надеюсь, это поможет.

3
ответ дан 28 November 2019 в 03:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: