jQuery – hashchange事件

我在用:

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

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

有没有办法与jQuery,我可以检测浏览器是否支持hashchange事件? 也许用jQuery.support东西…

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

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

也可以看看:

  • 在没有浏览器嗅探的情况下检测事件支持
  • onhashchange没有setInterval的情况下模拟onhashchange
  • window.onhashchange

有一个hashchange插件,它涵盖了这里提供的function和跨浏览器的问题。

一个不同的方法来解决你的问题

有三种方法将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。

尝试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; 

我只是遇到了同样的问题(在IE7中缺lesshashchange事件)。 一个适合我的目的的解决方法是绑定哈希变化链接的点击事件。

 <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); } }); 

这个方法在我到目前为止所尝试的大多数浏览器中工作正常。

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

请注意,在IE 7和IE 9的情况下,如果statment会为(在窗口中的“onhashchange”)赋予true,但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); } 

在2017年这里更新的答案应该是任何人都需要的,在所有主stream浏览器中都支持onhashchange 。 详情请参阅caniuse 。 要使用jQuery,不需要插件:

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

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

我认为克里斯·科伊尔有解决这个哈希问题,看看他的截屏:

dynamic内容的最佳实践

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

Modernizr的wiki提供了一个库列表,可以将HTML5function添加到旧浏览器中。 hashchange列表包含一个指向项目HTML5 History API的指针,如果您想要模拟旧浏览器中的行为,该项目似乎可以提供您需要的function。

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