Я использую:
$(window).bind( 'hashchange', function(e) { });
чтобы привязать функцию к событию изменения хэша. Кажется, это работает в IE8, Firefox и Chrome, но не в Safari, и я предполагаю, что не в более ранней версии IE. Для этих браузеров я хочу отключить свой код JavaScript, который использует хэш и hashchange
событие.
Есть ли способ с помощью jQuery, который я могу определить, поддерживает ли браузер hashchange
событие? Может что-то с jQuery.support
...
javascript
jquery
hashchange
browser-state
Ян Герберт
источник
источник
Ответы:
Вы можете определить, поддерживает ли браузер событие:
if ("onhashchange" in window) { //... }
Смотрите также:
onhashchange
без setIntervalwindow.onhashchange
источник
Обновленный ответ здесь по состоянию на 2017 год, если он кому-то понадобится,
onhashchange
хорошо поддерживается во всех основных браузерах. См. Caniuse для подробностей. Чтобы использовать его с jQuery, плагин не нужен:$( window ).on( 'hashchange', function( e ) { console.log( 'hash changed' ); } );
Иногда я сталкиваюсь с устаревшими системами, в которых все еще используются URL-адреса hashbang, и это полезно. Если вы создаете что-то новое и используете хеш-ссылки, я настоятельно рекомендую вам рассмотреть возможность использования вместо этого HTML5 pushState API.
источник
window.location.hash
для доступа к текущему хешу.Существует подключаемый модуль hashchange, который завершает доступную здесь функциональность и кроссбраузерность .
источник
Другой подход к вашей проблеме ...
Есть 3 способа привязать событие hashchange к методу:
<script> window.onhashchange = doThisWhenTheHashChanges; </script>
Или
<script> window.addEventListener("hashchange", doThisWhenTheHashChanges, false); </script>
Или
<body onhashchange="doThisWhenTheHashChanges();">
Все они работают с IE 9, FF 5, Safari 5 и Chrome 12 на Win 7.
источник
попробуйте официальный сайт Mozilla: https://developer.mozilla.org/en/DOM/window.onhashchange
цитировать следующее:
if ("onhashchange" in window) { alert("The browser supports the hashchange event!"); } function locationHashChanged() { if (location.hash === "#somecoolfeature") { somecoolfeature(); } } window.onhashchange = locationHashChanged;
источник
Я столкнулся с той же проблемой (отсутствие события hashchange в IE7). Обходной путь, который подходил для моих целей, заключался в привязке события click для ссылок, изменяющих хэш.
<a class='hash-changer' href='#foo'>Foo</a> <script type='text/javascript'> if (("onhashchange" in window) && !($.browser.msie)) { //modern browsers $(window).bind('hashchange', function() { var hash = window.location.hash.replace(/^#/,''); //do whatever you need with the hash }); } else { //IE and browsers that don't support hashchange $('a.hash-changer').bind('click', function() { var hash = $(this).attr('href').replace(/^#/,''); //do whatever you need with the hash }); } </script>
источник
$('a[href^="#"]')
для получения ссылок наhref
s, начинающихся с хеша, избегая необходимости в добавлении классаОбратите внимание, что в случае IE 7 и IE 9, если статус будет верен для ("onhashchange" в окнах), но window.onhashchange никогда не сработает, поэтому лучше сохранять хэш и проверять его через каждые 100 миллисекунд, изменилось ли оно или нет для всех версий IE.
if (("onhashchange" in window) && !($.browser.msie)) { window.onhashchange = function () { alert(window.location.hash); } // Or $(window).bind( 'hashchange',function(e) { // alert(window.location.hash); // }); } else { var prevHash = window.location.hash; window.setInterval(function () { if (window.location.hash != prevHash) { prevHash = window.location.hash; alert(window.location.hash); } }, 100); }
источник
А как насчет использования другого способа вместо хеш-события и прослушивания popstate-а.
window.addEventListener('popstate', function(event) { if(window.location.hash) { var hash = window.location.hash; console.log(hash); } });
Этот метод отлично работает в большинстве браузеров, которые я пробовал до сих пор.
источник
этот крошечный плагин jQuery очень прост в использовании: https://github.com/finnlabs/jquery.observehashchange/
источник
Думаю, у Криса Койера есть решение этой проблемы с хешированием, посмотрите его скринкаст:
Лучшие практики с динамическим контентом
источник
Используйте Modernizr для определения возможностей функций. В целом jQuery предлагает обнаруживать функции браузера: http://api.jquery.com/jQuery.support/ . Однако hashchange отсутствует в списке.
Вики из Modernizr предлагает список библиотек для добавления возможности HTML5 в старых браузерах. Список для hashchange включает в себя указатель на проект HTML5 History API , который , кажется , чтобы предложить функциональность вам потребуется , если вы хотите , чтобы эмулировать поведение в старых браузерах.
источник
Вот обновленная версия @ johnny.rodgers
Надежда кому-то помогает.
// ie9 ve ie7 return true but never fire, lets remove ie less then 10 if(("onhashchange" in window) && navigator.userAgent.toLowerCase().indexOf('msie') == -1){ // event supported? window.onhashchange = function(){ var url = window.location.hash.substring(1); alert(url); } } else{ // event not supported: var storedhash = window.location.hash; window.setInterval(function(){ if(window.location.hash != storedhash){ storedhash = window.location.hash; alert(url); } }, 100); }
источник