2010-06-22 111 views
75

我使用:jQuery的 - hashchange事件

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

綁定到哈希改變事件的功能。這似乎適用於IE8,Firefox和Chrome,但不適用於Safari,我假設不在早期版本的IE中。對於這些瀏覽器,我想禁用使用哈希和hashchange事件的JavaScript代碼。

有沒有一種與jQuery的方式,我可以檢測瀏覽器是否支持hashchange事件?也許一些與jQuery.support ...

+3

[jQuery hashchange事件](http://benalman.com/projects/jquery-hashchange-plugin/) - 即使在IE8中,jQuery插件也是完美的。 +它很容易使用:) – enloz 2011-09-16 03:38:59

回答

17

有一個hashchange插件,它封裝了功能性和跨瀏覽器發出available here

+0

只適用於 2016-04-14 10:09:55

2

請注意,在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); 
    } 
+2

瀏覽器處理這不是太多嗎?每100毫秒輪詢一次哈希變化? – adardesign 2011-07-06 17:53:26

+5

你的示例代碼使我的IE8警報,直到我打開任務管理器並殺死進程:) – enloz 2011-09-16 03:29:45

+0

這是因爲有一個錯字,而不是「storedHash」使用「prevHash」,它會工作。他基本上使用了一個不同的變量名稱。 – Nick 2013-09-26 05:57:21

17

一種不同的方法,您的問題...

有到hashchange事件綁定到方法3種方式:

<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的所有工作

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; 
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> 
+0

你可以使用'$('a [href^=「#」]')來獲得以散列開頭的'href'的鏈接,避免需要類添加 – tobymackenzie 2016-09-21 04:27: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); 
} 
2

怎麼樣用不同的方式代替哈希事件並且像popstate一樣聽popstate。

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

這種方法在我到目前爲止嘗試過的大多數瀏覽器中工作正常。

+1

Popstate甚至比hashchange更新。例如,它在IE <10中不被支持。 – 2015-12-30 18:34:53

4

如果有人需要它,2017年更新的答案是onhashchange在所有主流瀏覽器中都得到很好的支持。詳情請參閱caniuse。要與jQuery使用它無需插件:

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

偶爾我會遇到地方仍在使用hashbang URL的遺留系統,這是很有幫助的。如果您正在構建新的內容並使用哈希鏈接,我強烈建議您考慮使用HTML5 pushState API。

+0

這個效果很好,使用'window.location.hash'來訪問當前散列。 – 2018-03-08 10:16:56