jQuery - hashchange事件

时间:2010-06-22 05:20:13

标签: javascript jquery hashchange browser-state

我正在使用:

$(window).bind( 'hashchange', function(e) { });

将函数绑定到散列更改事件。这似乎适用于IE8,Firefox和Chrome,但不适用于Safari,我认为不是早期版本的IE。对于这些浏览器,我想禁用使用哈希和hashchange事件的JavaScript代码。

如果浏览器支持hashchange事件,我可以检测jQuery吗?也许有jQuery.support ...

的东西

12 个答案:

答案 0 :(得分:68)

您可以通过以下方式检测浏览器是否支持该事件:

if ("onhashchange" in window) {
  //...
}

另见:

答案 1 :(得分:27)

2017年的更新答案,如果有人需要,是onhashchange在所有主流浏览器中都得到了很好的支持。有关详细信息,请参阅caniuse。要与jQuery一起使用,不需要插件:

$( window ).on( 'hashchange', function( e ) {
    console.log( 'hash changed' );
} );

偶尔我会遇到仍然使用hashbang网址的遗留系统,这很有帮助。如果您正在构建新内容并使用哈希链接,我强烈建议您考虑使用HTML5 pushState API。

答案 2 :(得分:18)

有一个hashchange插件,它包含了功能和跨浏览器问题available here

答案 3 :(得分:17)

解决问题的另一种方法......

有三种方法可以将hashchange事件绑定到方法:

<script>
    window.onhashchange = doThisWhenTheHashChanges;
</script>

或者

<script>
    window.addEventListener("hashchange", doThisWhenTheHashChanges, false);
</script>

或者

<body onhashchange="doThisWhenTheHashChanges();">

这些都适用于Win 7上的IE 9,FF 5,Safari 5和Chrome 12.

答案 4 :(得分: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;

答案 5 :(得分:3)

我遇到了同样的问题(在IE7中缺少hashchange事件)。适合我的目的的解决方法是绑定散列更改链接的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>

答案 6 :(得分:2)

请注意,对于IE 7和IE 9,如果statment将给出true(Windows中的“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);
    }

答案 7 :(得分:2)

如何使用不同的方式而不是哈希事件,并听取类似的popstate。

window.addEventListener('popstate', function(event)
{
    if(window.location.hash) {
            var hash = window.location.hash;
            console.log(hash);
    }
});

此方法在我迄今为止尝试的大多数浏览器中都能正常工作。

答案 8 :(得分:1)

这个小巧的jQuery插件使用起来非常简单:https://github.com/finnlabs/jquery.observehashchange/

答案 9 :(得分:0)

我认为Chris Coyier解决了这个哈希问题,看看他的截屏视频:

Best Practices with Dynamic Content

答案 10 :(得分:0)

使用Modernizr检测功能。通常,jQuery提供检测浏览器功能:http://api.jquery.com/jQuery.support/。但是,hashchange不在列表中。

wiki of Modernizr提供了一个库列表,用于向旧浏览器添加HTML5功能。 list for hashchange包含指向项目HTML5 History API的指针,如果您想模拟旧浏览器中的行为,它似乎提供了您需要的功能。

答案 11 :(得分:0)

这是@ 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);
}