2010-06-22 24 views
75

sto usando:jQuery - evento hashchange

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

per associare un funzione per l'evento di modifica hash. Questo sembra funzionare in IE8, Firefox e Chrome, ma non in Safari e presumo non nella versione precedente di IE. Per questi browser, desidero disattivare il mio codice JavaScript che utilizza l'hash e l'evento hashchange.

C'è un modo con jQuery che posso rilevare se il browser supporta l'evento hashchange? Forse qualcosa con jQuery.support ...

+3

[evento jQuery hashchange] (http://benalman.com/projects/jquery-hashchange-plugin/) - Il plugin jQuery funziona perfettamente, anche in IE8. + è molto facile da usare :) – enloz

risposta

17

C'è un hashchange plug-in, che avvolge la funzionalità e cross browser emette available here.

+0

Richiesto solo per

2

Si noti che in caso di IE 7 e IE 9 se la statistica darà true per ("onhashchange" in windows) ma window.onhashchange non verrà mai attivato, quindi è meglio memorizzare l'hash e controllarlo ogni 100 millisecondi se è cambiato o no per tutte le versioni di 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

Non è troppo per il browser da gestire? interrogare per un cambio di hash ogni 100ms? – adardesign

+5

il tuo codice di esempio ha fatto il mio avviso IE8 fino a quando ho aperto il task manager e il processo ucciso :) – enloz

+0

è perché c'è un errore di battitura, invece di "storedHash" usa "prevHash" e funzionerà. Fondamentalmente ha usato un nome di variabile diverso da come è stato dichiarato. – Nick

17

Un approccio diverso al vostro problema ...

Ci sono 3 modi per legare l'evento hashchange a un metodo:

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

O

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

O

<body onhashchange="doThisWhenTheHashChanges();"> 

Questi tutti i lavori con IE 9, FF 5, Safari 5 e Chrome 12 su Win 7.

7

provare sito ufficiale di Mozilla: https://developer.mozilla.org/en/DOM/window.onhashchange

citano come segue:

if ("onhashchange" in window) { 
    alert("The browser supports the hashchange event!"); 
} 

function locationHashChanged() { 
    if (location.hash === "#somecoolfeature") { 
     somecoolfeature(); 
    } 
} 

window.onhashchange = locationHashChanged; 
3

ho appena ha incontrato lo stesso problema (mancanza di eventi di hashchange in IE7). Una soluzione adatta ai miei scopi era quella di associare l'evento click dei collegamenti che cambiano hash.

<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

potresti usare '$ ('a [href^=" # "]')' per ottenere collegamenti a 'href's che iniziano con un hash, evitando la necessità di aggiungere una classe – tobymackenzie

0

Usa Modernizr per il rilevamento delle capacità caratteristica. In generale, jQuery offre il rilevamento delle funzionalità del browser: http://api.jquery.com/jQuery.support/. Tuttavia, hashchange non è nell'elenco.

wiki of Modernizr offre un elenco di librerie per aggiungere funzionalità HTML5 ai vecchi browser. Lo list for hashchange include un puntatore al progetto HTML5 History API, che sembra offrire la funzionalità necessaria se si desidera emulare il comportamento nei vecchi browser.

0

qui rappresentati versione di johnny.rodgers @

Speranza aiuta qualcuno.

// 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

Che dire di utilizzare un modo diverso invece dell'evento hash e ascoltare popstate come.

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

Questo metodo funziona bene nella maggior parte dei browser che ho provato finora.

+1

Popstate è ancora più recente di hashchange. Ad esempio, non è supportato in IE <10. –

4

Una risposta aggiornata qui a partire dal 2017, qualora qualcuno ne avesse bisogno, è che onhashchange è ben supportato in tutti i principali browser. Vedi caniuse per i dettagli. Per usarlo con jQuery non è necessario alcun plugin:

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

Di tanto in tanto mi venire attraverso i sistemi legacy, dove sono ancora utilizzati hashbang URL e questo è utile. Se stai creando qualcosa di nuovo e stai usando i collegamenti hash, ti consiglio caldamente di prendere in considerazione l'utilizzo dell'API push-in HTML5.

+0

Funziona bene, usa 'window.location.hash' per accedere all'hash corrente. –