jQuery - событие hashchange
Я использую:
$(window).bind( 'hashchange', function(e) { });
привязать функцию к событию изменения хеша. Кажется, это работает в IE8, Firefox и Chrome, но не в Safari, и я предполагаю, что не в более ранней версии IE. Для этих браузеров я хочу отключить мой код JavaScript, который использует хэш и hashchange
событие.
Есть ли способ с jQuery, который я могу определить, поддерживает ли браузер hashchange
событие? Может быть, что-то с jQuery.support
...
12 ответов
Вы можете определить, поддерживает ли браузер событие:
if ("onhashchange" in window) {
//...
}
Смотрите также:
- Обнаружение поддержки событий без перехвата браузера
- Эмуляция
onhashchange
без setInterval window.onhashchange
Обновленный ответ здесь по состоянию на 2017 год, если кому-то это нужно, это то, что onhashchange
хорошо поддерживается во всех основных браузерах. Смотрите caniuse для деталей. Для использования с jQuery плагин не требуется:
$( window ).on( 'hashchange', function( e ) {
console.log( 'hash changed' );
} );
Иногда я сталкиваюсь с устаревшими системами, в которых URL-адреса хэш-бэнга все еще используются, и это полезно. Если вы создаете что-то новое и используете хеш-ссылки, я настоятельно рекомендую вам вместо этого использовать HTML5 pushState API.
Есть плагин 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). Обходным решением, которое подходило для моих целей, было связывание события щелчка ссылок с изменением хеша.
<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>
Как насчет использования другого способа вместо хеш-события и прослушивания как popstate.
window.addEventListener('popstate', function(event)
{
if(window.location.hash) {
var hash = window.location.hash;
console.log(hash);
}
});
Этот метод отлично работает в большинстве браузеров, которые я пробовал до сих пор.
Обратите внимание, что в случае IE 7 и IE 9, если для statment будет задано значение true ("onhashchange" в windows), но 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);
}
Этот крошечный плагин jQuery очень прост в использовании: https://github.com/finnlabs/jquery.observehashchange/
Вот обновленная версия @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);
}
Я думаю, у Криса Койера есть решение для этой проблемы хэширования, взгляните на его скринкаст:
Используйте Modernizr для обнаружения возможностей функции. В общем, jQuery предлагает определить функции браузера: http://api.jquery.com/jQuery.support/. Однако hashchange отсутствует в списке.
Вики Modernizr предлагает список библиотек для добавления возможностей HTML5 в старые браузеры. Список для hashchange включает указатель на API истории HTML5 проекта, который предлагает функциональность, которая понадобится вам, если вы захотите эмулировать поведение в старых браузерах.