2010-04-08 9 views
24

Necesito modificar el hash, eliminarlo después de que se realice cierto procesamiento, de modo que si el usuario se actualiza no provoque que el proceso vuelva a ejecutarse.javascript location.hash refrescante en IE

Esto funciona bien en FF, pero parece que IE se recarga cada vez que trato de cambiar el hash. Creo que está relacionado con otras cosas que se están cargando en la página, aunque no estoy seguro. Tengo un iframe que se carga (relacionado con el proceso), así como algunos scripts que aún se están recuperando en la ventana principal.

Parece que no se me ocurre una buena manera de cambiar el hash una vez completada la carga. Y, al mismo tiempo, ni siquiera estoy seguro de que esté relacionado con la carga.

¿Alguna idea sobre cómo solucionar esto?

Más comportamiento impar: El hash proviene de otra parte de la aplicación web mediante un redireccionamiento. He encontrado que si simplemente agrego el hash a mano, al agregar #myid a la url, no se vuelve a cargar. No importa si ingreso el hash en una página que ya se ha cargado (agregando # myid a la url ya existente) o ingresando la URL completa en una nueva pestaña.

+0

Similar a http://stackoverflow.com/questions/1985056/response-redirect-with-a-fragment-identifier-causes-unexpected-refresh-when-later – casey

+0

¿Puede proporcionar los pasos de reproducción? Tengo un sitio web que usa URL de fragmento escapado (# !, también conocido como hash-bang) y no puedo reproducir este error. Probado en IE9.0.8 e IE10RP. –

Respuesta

-5

Me parece que si cambia el hash, básicamente está cambiando la ubicación de la página, y entonces IE (o cualquier navegador) se volvería a cargar. ¿Cómo estás tratando de hacer esto? window.location.hash = "";?

Quizás Firefox sea lo suficientemente inteligente como para ver lo que estás haciendo y evitar la actualización.

+0

Lo que pasa con el hash es que el navegador no lo considera una parte de la ubicación física, es solo una parte del cliente, no se envía a los servidores. Se supone que no debe volver a cargar la página en ningún navegador, se supone que debe llevarlo a un ancla en la página. – aepheus

+0

Bueno, acabo de probarlo en IE8 y negué mi respuesta :) - Puse un par de botones en una página. En uno, configuré window.location.hash en un valor - haciendo clic en enviarme al ancla. En el otro botón establecí window.location.hash en "" (cadena vacía) - haciendo clic en enviarme al principio de la página. En ninguno de los casos, la página se actualizó desde el servidor. Entonces, si publica el código donde está haciendo la escritura, tal vez alguien detectará el problema. – Ray

10

El problema es que "El hash proviene de otra parte de la aplicación web mediante un redireccionamiento". Si utiliza JavaScript para redirigir la dirección URL en el cliente de la siguiente manera:

location.href = 'test1.aspx#testhash' 

que va a estar bien!

Este es el error de IE: cuando una aplicación web a través de una redirección, el navegador solo puede ver la anterior, al modificar el location.hash, el navegador ve un cambio de URL, por lo que actualiza la página.

-3

Si utiliza JavaScript para establecer el hash no utilice un "#"

window.location.hash = '#foo'; //IE will reload the page 
window.location.hash = 'foo'; //IE will set the hash but will not reload the page 
+7

No creo que esto funcione como crees que funciona. –

17

Esto parece ser un error con Internet Explorer (probado con 7 y 8).

Al cambiar window.location.hash no debería producirse una recarga, y es una técnica de JavaScript común utilizar hash para mantener el estado.

Si manualmente carga una página y cambia el hash con JavaScript, funcionará.

El problema es cuando está redirigido a la página desde una ubicación diferente (es decir, utilizando el encabezado HTTP "Ubicación"), luego de modificar el hash se producirá una recarga.

Para solucionar este error que podía:

1) Si usted puede controlar la redirección, puede reemplazar la cabecera Location con algo de HTML.

<html> 
<head> 
    <meta http-equiv="refresh" content="0; url=__REDIRECT_LOCATION__"> 
    <script>window.location = "__REDIRECT_LOCATION__";</script> 
</head> 
</html> 

2) si no, se podría tratar de volver a cargar la página cuando se carga. Para evitar un ciclo de recarga, es posible que deba establecer una cookie.

window.location = window.location; // window.location.reload() didn't work. 

In pseudo code: 

// if is Internet Explorer 
//  if (cookie "reloadPerformed" is not set) 
//   set cookie "reloadPerformed" = "1" 
//   reload page 
//  else 
//   clear cookie "reloadPerformed" 

El inconveniente es que, obviamente, la carga de los resultados de la página en dos solicitud de página & hacen, por lo que sería deseable que la recarga sea una de las primeras cosas que la página no cuando se carga.

+0

Me temo que la solución # 2 dará como resultado un bucle si el usuario ha desactivado las cookies. – Sliq

+0

Este error ocurre en Windows Vista/Server 2008 con IE8 pero no en Windows 7 con IE8 ... –

14

@JarneCook parece estar bien, es un error en IE.

Usted puede ser capaz de simplemente hacer:

<script type="text/javascript"> 
    window.location.hash = window.location.hash; 
</script> 

en la parte superior de la página. En circunstancias normales, esto debería ser no operativo, pero si el usuario está utilizando IE y ha llegado a través de un redireccionamiento, la página se volverá a cargar antes incluso de que note que se ha cargado.

+0

¡Esta es la mejor solución! IE comprueba el HTTP Referrer y, en caso de redirección, falta. Por lo tanto, IE actualiza la página tan pronto como se ejecuta cuando se establece window.location.hash. –

+0

¡Mejor solución, gracias! – Nivco

+0

Esta solución salvó mi día. Muchas gracias @rjmunro, y _GO TO HELL IE! _ – Feugy

1

El problema similar existía en mi proyecto. Pero no pudimos usar los métodos descritos anteriormente, porque cuando IE actualizaba una página, los datos preinstalados se restablecían. Entonces, usamos la función del navegador. Cuando hace clic para la etiqueta 'a', el evento onClick se realiza en primer lugar y luego del navegador de eventos utiliza el atributo 'href' para redireccionar. Cuando IE usa href con hash para redireccionar, no existe recarga. Por lo tanto, puede usar el evento onClick para invocar el procesamiento del lado del servidor (__ doPostBack para asp.net, por ejemplo) y cuando se ejecutará el procesamiento, el navegador usará el atributo 'href' para redireccionar. Por lo tanto, la página nueva no se volverá a cargar. También puede usar window.location = yourNewLocationWithHash invocando después del procesamiento del lado del servidor. Espero que esta ayuda =)

0

Aquí hay una solución de varios navegadores. Funciona en IE, Chrome, Safari y FF (probado con las últimas versiones).

var pos = location.href.indexOf('c='); 
location = (pos < 0 ? 
        location + (location.href.indexOf('?') < 0 ? '?' : '&') 
        : location.href.substring(0, pos)) 
      + 'c=' + Math.floor(Math.random()*11) + '#' + comment_id ; 

Básicamente, me aprovecho de consulta ("?") Para activar la cadena de recarga de la página de almohadilla. Lo que hace la primera línea es comprobar si existe nuestra cadena de consulta "dorada" (yo uso la variable "c" que significa "comentario"). Si existe,

  1. la nueva URL tendrá todo antes de esa "c =";
  2. y luego agrega nuestra "c" dorada + un número aleatorio entre 0 y 10 + "#" + mi ID de comentario al que el navegador debe saltar cuando se recarga.

Si no hay,

  1. la nueva URL tendrá todo lo viejo URL solía tener;
  2. si la antigua URL ya contiene alguna otra cadena de consulta (algo después de "?"), Agregue un operador de consulta de consulta "&";
  3. si no "?", Luego agréguelo;
  4. luego sigue la consulta "dorada" mencionada anteriormente.

La razón por la que agrego un número al azar después de "?" es que después de la primera recarga hay algo como "? # comment-10". En este caso, el siguiente cambio en la URL no volverá a cargar la página, ya que el navegador la entiende como una instrucción de salto de anclaje.

Para forzar la recarga, debemos agregar algo aleatorio a la consulta para que la nueva URL sea diferente de la anterior.

Esta solución funcionará en todos los navegadores y se asegurará de que la recarga no rompa la consulta existente. La única nota es para asegurarse de que su nombre de variable de consulta "dorado" sea único.

Espero que esto ayude.

1

Se estaba enfrentando este problema, como se sugirió en una de las respuestas, el problema fue solo cuando se realizó una redirección 302/301. El cambio de hash no se vuelve a cargar si la página no fue redirigida. Estaba redireccionando usando PHP y no quería usar una cookie para detener la redirección.

Más sobre este tema también estaba en algunos navegadores IE9, intenté 5 navegadores IE9, 4 recargué la página.

Aquí es una solución añadido esto en sección de la cabeza:

<!--[if lt IE 10]> 
    <script type="text/javascript"> 
     if(window.location.hash.replace('#','').length > 0 
      && window.location.hash.search('stopredirectioninie') == -1) 
     { 
      window.location.href = window.location.href+'&stopredirectioninie'; 
     } 
    </script> 
<![endif]--> 
0

tuvimos el mismo problema.

En nuestro caso, consistía en una URL http que fue redirigida a https por Apache. Como la cadena después del signo hash nunca se pasa al servidor, se perdió.