Да. Это похоже на различие между городской тюрьмой и дверью. Эти ManualResetEvent
дверь, которая должна быть закрыта (сброс) вручную. Эти AutoResetEvent
городская тюрьма, позволяя одному автомобилю пройти и автоматически закрываясь, прежде чем следующий сможет пройти.
Прежде всего, спасибо вам, ребята, которые ответили! =)
Я провел много дополнительных исследований и считаю, что доволен своей реализацией. Вот результаты моих исследований.
Прежде всего, моя законченная Hash
библиотека . Это автономная библиотека без зависимостей. Он имеет две функции: Hash.init (обратный вызов, iframe)
и Hash.go (newHash)
. Функция обратного вызова вызывается всякий раз, когда хеш изменяется с новым хешем в качестве первого аргумента, а в качестве второго аргумента - флаг, указывающий, вызывается ли обратный вызов из-за начального состояния ( истина
) или фактического изменения в hash ( false
).
Hash.js (лицензия MIT)
Я также сделал плагин jQuery, чтобы упростить его использование. Также добавляет глобальное событие hashchange
. См. Пример в исходном коде, чтобы узнать, как его использовать.
jquery.hash.js (лицензия MIT)
Чтобы увидеть их в использовании, перейдите на мою страницу "область" JavaScript:
Smooooth cruisin '! Просто подключите одно из событий onhashchange
к объекту window
(используя attachEvent
) и получите местоположение . значение hash
в обработчике событий.
Не имеет значения, щелкает ли пользователь ссылку с хешем или вы устанавливаете хеш программно; история хранится отлично.
Плавный ход! Просто запросите изменения в свойстве location.hash
, используя setInterval
и функцию.
История работает отлично. Для Opera я установил history.navigationMode
на 'совместимый'
. Честно говоря, я не уверен, что он делает, я сделал это по рекомендации из комментария в коде YUI.
Примечание : Opera нуждается в дополнительном тестировании, но пока что у меня все работает нормально.
Бонус-сюрприз! (Неужели?!) Оказывается, Firefox (подтвержденный только в 3.5+) декодирует свойство location.hash
, так что это может вызвать событие hashchange
дважды (сначала для закодированной версии, затем для незашифрованной). Существует новая версия моей библиотеки Hash.js, которая учитывает это, используя местоположение Вместо этого свойство .href
(изменения предоставлены Аароном Оглом.)
Теперь становится еще хуже. История переходов в старых версиях 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%.
Я не уверен, что полностью понимаю ваши потребности, но я использовал действительно простой Библиотека истории ( http://code.google.com/p/reallysimplehistory/ ) для реализации чего-то подобного. Вы можете увидеть это здесь: http://whiteoak.sourceforge.net/
На основании усилий, которые вы вложили в это, я предполагаю, что вы: мы видели 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. Похоже, вам это будет интересно.
Надеюсь, это поможет.