2010-09-17 34 views
5

Acabo de encontrar un comportamiento extraño en Firefox 3.6/Mac. Sin embargo, sospecho que es un comportamiento general de Firefox.El redireccionamiento de JavaScript (location.href) rompe el botón Atrás a menos que se use setTimeout()

creé dos páginas de prueba muertos-simples que cambian la propiedad window.location.href para navegar hasta nueva URL:

Si intenta lo siguiente con cualquiera de los archivos:

  • Abra una pestaña del navegador nueva/en blanco.
  • Pega la URL y presiona "Enter".

Notarás una diferencia entre las dos: utilizando el primer enlace, el botón "Atrás" del navegador está deshabilitado; usando el segundo, está habilitado y funciona como yo esperaba.

La única diferencia entre los dos scripts es que este último establece un tiempo de espera de un segundo antes de cambiar window.location.href.

No sé por qué sucede esto, y estoy tratando de lograr el comportamiento del segundo script (donde el botón "Atrás" sigue funcionando como se espera) sin causar ningún retraso para el usuario.

Mi mejor conjetura es que tal vez Firefox trata a un inmediato "redirigir" mediante el establecimiento de window.location.href lo mismo que usar el método window.location.replace(), ya que creo que es común para los desarrolladores utilizar la antigua cuando la intención de utilizar este último. Tal vez al usar setTimeout, dado que esto hace que el código se ejecute de forma asincrónica, se anula este comportamiento. ¿Podría ser ese el caso?

No he experimentado con el valor mínimo para setTimeout para lograr el efecto deseado, pero lo haré ahora. Sin embargo, me gustaría descubrir por qué sucede esto exactamente.

Gracias!

+0

La primera funciona perfectamente para mí: presione el botón Atrás y regrese a esta página. Por el segundo, una vuelta muestra una página en blanco, el segundo vuelve aquí. Si abro en una pestaña nueva, la primera funciona como se espera, no hay respaldo disponible. El segundo vuelve a una página en blanco. Estos son todos los comportamientos exactos que esperaría de su descripción. –

+2

@Skip Head - ¿por qué? ¿por qué simplemente establecer un tiempo de espera cambia el comportamiento? – sje397

+1

Probó algunos navegadores más para usted: sucede en Chrome en Linux/Mac y Opera para Mac. No ocurre en Safari para Mac o Firefox para Linux. – Robert

Respuesta

1

Mi mejor conjetura es que tal vez Firefox trata a un inmediato "redirigir" mediante el establecimiento de window.location.href lo mismo que usar el método window.location.replace(), ya que creo que es común para los desarrolladores utilizar la anterior cuando tenían la intención de usar el último. Tal vez el uso de setTimeout, ya que hace que el código se ejecute de forma asincrónica, anule este comportamiento. ¿Podría ser ese el caso?

He estado told su conjetura es correcta, pero ahora que lo mira, hay no parece haber ninguna mención de este requisito en el HTML5 spec (ligarse a la página más relevante, ya que es difícil vincular a la ausencia de requisito).

2

Tiene razón al suponer que la configuración de location.href mientras se carga una página se trata como un reemplazo. De hecho, hay dos comportamientos separados.

El primero es que la configuración location.href del script que se ejecuta como resultado del análisis de una etiqueta siempre se interpreta como un reemplazo. Esto fue implemented para reflejar el comportamiento de Netscape 4 y subsequentlytweaked.

El segundo es que cualquier documento nuevo cargado como resultado de un controlador de carga también se interpreta siempre como un reemplazo. Esto fue implemented y también tweaked.

Pero tengo curiosidad de por qué está tan interesado en hacer esto, ya que significa que los usuarios tendrían que usar el menú desplegable Atrás para ir a la página antes de su página. (Regresar a una página sería inútil si continuara redirigiéndolas a la página actual.)

+0

Una razón por la que uno no quisiera reemplazar la página actual en el historial: tengo un bookmarklet que asigna a window.location para saltar de una página en un sitio (que no soy de mi propiedad) a una página relacionada en otro sitio. Sin setTimeout, el uso del marcador borra la página de inicio del historial. Con setTimeout, funciona de la manera que cabría esperar: pulse el marcador, salte a la otra página, luego retroceda para volver al lugar de donde vino. –

Cuestiones relacionadas