2010-06-22 7 views
75

estoy usando:jQuery - evento hashchange

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

se unen a una función para el evento de cambio de hash. Esto parece funcionar en IE8, Firefox y Chrome, pero no en Safari y supongo que no en versiones anteriores de IE. Para estos navegadores, deseo desactivar mi código JavaScript que usa el hash y el evento hashchange.

¿Hay alguna manera con jQuery que puedo detectar si el navegador admite el evento hashchange? Tal vez algo con jQuery.support ...

+3

[jQuery hashchange event] (http://benalman.com/projects/jquery-hashchange-plugin/) - jQuery plugin funciona perfecto, incluso en IE8. + es muy fácil de usar :) – enloz

Respuesta

65

Usted puede detectar si el navegador es compatible con el evento por:

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

Ver también:

+0

Gracias por eso y por la respuesta rápida. –

+18

Tenga en cuenta que IE8 que se ejecuta en modo de compatibilidad con IE7 informa verdadero para 'onhashchange' en la ventana, aunque el evento no sea compatible -desde jQuery Mobile – Vikas

17

Hay una hashchange plug-in, que envuelve la funcionalidad y emite navegadores available here.

+0

Solo es necesario para

2

Tenga en cuenta que en caso de IE 7 e IE 9 si la sentencia será verdadera ("onhashchange" en Windows) pero el window.onhashchange nunca se disparará, por lo que es mejor almacenar el hash y verificarlo cada 100 milisegundos si está cambiado o no para todas las versiones de 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

¿No es esto demasiado para el navegador? para sondear un cambio de hash cada 100 ms? – adardesign

+5

su código de muestra hizo que mi IE8 alertara hasta que abrí el administrador de tareas y eliminé el proceso :) – enloz

+0

eso es porque hay un error tipográfico, en lugar de "storedHash" usa "prevHash" y funcionará. Básicamente usó un nombre de variable diferente de cómo se ha declarado. – Nick

17

Un enfoque diferente a su problema ...

Hay 3 formas de enlazar el evento hashchange a un método:

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

O

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

O

<body onhashchange="doThisWhenTheHashChanges();"> 

Todos estos trabajos con IE 9, 5 FF, Safari 5 y Chrome 12 en Win 7.

7

tratar Mozilla sitio oficial: https://developer.mozilla.org/en/DOM/window.onhashchange

citan los siguientes:

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

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

window.onhashchange = locationHashChanged; 
3

acabo se encontró con el mismo problema (falta del evento hashchange en IE7). Una solución alternativa adecuada para mis propósitos era vincular el evento click de los enlaces de cambio de 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

puede usar '$ ('a [href^=" # "]')' para obtener enlaces a 'href's que comiencen con un hash, evitando la necesidad de agregar una clase – tobymackenzie

0

Uso Modernizr para la detección de posibilidades funcionales que ofrece. En general, jQuery ofrece detectar las características del navegador: http://api.jquery.com/jQuery.support/. Sin embargo, hashchange no está en la lista.

wiki of Modernizr ofrece una lista de bibliotecas para agregar capacidades HTML5 a navegadores antiguos. El list for hashchange incluye un puntero al proyecto HTML5 History API, que parece ofrecer la funcionalidad que necesitaría si quisiera emular el comportamiento en navegadores antiguos.

0

Aquí se actualiza la versión de @ johnny.rodgers

Esperanza ayuda a alguien.

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

¿Qué pasa si usamos una forma diferente en lugar del evento hash y escuchamos popstate como.

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

Este método funciona bien en la mayoría de los navegadores que he probado hasta ahora.

+1

Popstate es incluso más reciente que hashchange. Por ejemplo, no es compatible con IE <10. –

4

Una respuesta actualizada aquí a partir de 2017, si alguien lo necesita, es que onhashchange es bien compatible en todos los principales navegadores. Vea caniuse para más detalles. Para usarlo con jQuery no se necesita ningún plugin:

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

De vez en cuando me encuentro con sistemas heredados, donde todavía se utilizan Hashbang URL y esto es útil. Si está creando algo nuevo y utilizando enlaces hash, le sugiero que considere utilizar la API pushState HTML5 en su lugar.

+0

Esto funciona bien, use 'window.location.hash' para acceder al hash actual. –