2009-12-18 29 views
26

Tengo una aplicación pesada Ajax que puede tener un enlace como¿Cómo puedo detectar un cambio en la barra de direcciones con JavaScript?

http://example.com/myApp/#page=1 

Cuando un usuario manipula el sitio, la barra de direcciones se puede cambiar a algo así como

http://example.com/myApp/#page=5 

sin recargar la página.

Mi problema es el siguiente orden:

  1. Un usuario Favoritos la primera URL.
  2. El usuario manipula la aplicación de modo que la segunda URL sea el estado actual.
  3. El usuario hace clic en el marcador creado en el paso 1.
  4. La dirección URL en la barra de direcciones de http://example.com/myApp/#page=5 a http://example.com/myApp/#page=1, pero no sé de una manera de detectar el cambio ocurrió.

Si detecto un cambio, algo de JavaScript podría actuar sobre él.

+0

Tengo curiosidad, ¿por qué fue la aplicación diseñada de esta manera? No veo ninguna necesidad real de cambio de URL. –

+0

Funciona igual que una cadena de consulta, pero no hace que el navegador vuelva a cargar la página. Esto se hizo para que la carga útil del cliente no tenga que ser recuperada y cargada cada vez que se cambie una página. La carga útil no se almacena en caché fácilmente, exige un tiempo de inicialización sustancial de JavaScript y no proporcionaría al cliente una experiencia parecida. – JoshNaro

Respuesta

33

HTML5 presenta un evento hashchange que le permite registrarse para notificaciones de cambios de hash de url sin sondeo para ellos con un temporizador.

Es compatible con todos los navegadores más importantes (Firefox 3.6, IE8, Chrome, otros navegadores basados ​​en Webkit), pero aún sugiero utilizar una biblioteca que maneje el evento para usted, es decir, mediante el uso de un temporizador en navegadores que no admiten el evento HTML5 y usan el evento de lo contrario.

Para obtener más información sobre el evento, consulte https://developer.mozilla.org/en/dom/window.onhashchange y http://msdn.microsoft.com/en-us/library/cc288209%28VS.85%29.aspx.

+1

Ahora, solo aquellos usuarios de IE6/7 actualizarían todos a> = IE8. Gracias por la actualización. – JoshNaro

+0

Gracias. Esta respuesta es mejor que la respuesta aceptada. –

+0

Empecé a usar el complemento jqouery del evento hashChange: todo funciona sin problemas: D – JJschk

19

verificación de la dirección de la corriente periódicamente usando setTimeout/intervalo:

var oldLocation = location.href; 
setInterval(function() { 
     if(location.href != oldLocation) { 
      // do your action 
      oldLocation = location.href 
     } 
    }, 1000); // check every second 
+1

Esta respuesta es correcta. También debería considerar usar algo como los componentes del administrador de historial de YUI, que lo hace por usted, en una forma de navegador cruzado. –

+0

Si escribo una nueva dirección y presiono Enter, no hay manera de que la página actual pueda detener eso. – ZippyV

+2

Sí, esperaba que hubiera un evento oculto o algo así. Usar un intervalo simplemente no me parece "correcto" de alguna manera. Gracias. – JoshNaro

5

debe ampliar el objeto ubicación para exponer un evento que se puede enlazar a.

es decir:

window.location.prototype.changed = function(e){}; 

(function() //create a scope so 'location' is not global 
{ 
    var location = window.location.href; 
    setInterval(function() 
    { 
     if(location != window.location.href) 
     { 
      location = window.location.href; 
      window.location.changed(location); 
     } 
    }, 1000); 
})(); 

window.location.changed = function(e) 
{ 
    console.log(e);//outputs http://newhref.com 
    //this is fired when the window changes location 
} 
+0

¿Necesito jquery para que esto funcione? – ATOzTOA

+1

En realidad, como usa un temporizador, realmente no aporta ningún mejoramiento de lo que hace la solución seleccionada – jmd

+1

No es la mejor idea extender un objeto global que ya expone un valor que puede mirar. – Trendy

Cuestiones relacionadas