2009-10-19 18 views
33

Estoy tratando de volver a cargar la página actual con hash de URL diferente, pero no funciona como se esperaba.¿Cómo forzar a una página a volver a cargar si todo lo que se cambió en la url es hash?

(Aclaración cómo quiero que funcione:. Actualizar la página y luego desplazarse hasta el nuevo hash)

Enfoque # 1:

window.location.hash = "#" + newhash; 

Sólo se desplaza a esta ancla sin recargar la página.

Enfoque # 2:

window.location.hash = "#" + newhash; 
window.location.reload(true); 

Un poco pero funciona primeros se desplaza hasta el ancla, a continuación, vuelve a cargar la página, a continuación, se desplaza al ancla de nuevo.

Enfoque # 3:

window.location.href = window.location.pathname + window.location.search + "&random=" + Math.round(Math.random()*100000) + "#" + newhash; 

funciona, pero prefiero no añadir basura aleatoria a la URL.

¿Existe una solución mejor?

Respuesta

30

Quite el ancla que va a navegar, luego use el acercamiento # 2? Como no hay anclaje, la configuración del hash no debe desplazarse por la página.

+5

Al principio no entendí que te refieres a eliminarlo de DOM. Funciona, gracias. – serg

+1

Si desea mantener la pantalla más intacta, basta con eliminar su atributo 'name' o' id' para estos fines: el nodo en sí puede permanecer. – ecmanaut

2

Se debe esperar que #foo se desplace hacia el ancla del id, "foo". Si desea utilizar el enfoque n. ° 1 y hacer que vuelva a cargar, este enfoque podría funcionar.

if (Object.defineProperty && Object.getOwnPropertyDescriptor) { // ES5 
    var hashDescriptor = Object.getOwnPropertyDescriptor(location, "hash"), 
    hashSetter = hashDescriptor.set; 
    hashDescriptor.set = function (hash) { 
     hashSetter.call(location, hash); 
     location.reload(true); 
    }; 
    Object.defineProperty(location, "hash", hashDescriptor); 
} else if (location.__lookupSetter__ && location.__defineSetter__) { // JS 
    var hashSetter = location.__lookupSetter__("hash"); 
    location.__defineSetter__("hash", function (hash) { 
     hashSetter.call(location, hash); 
     location.reload(true) 
    }); 
} 
+0

No pude hacerlo funcionar. Incluso si lo hace sagrado $%^& :) – serg

+0

Nunca lo probé, pero debería funcionar en todos los navegadores principales (sin contar IE <8) y si no es más probable, porque IE no permitirá la redefinición del descriptor de location.hash por "razones de seguridad", aunque eso es bull –

+0

¡este enfoque funcionó para mí! extraño – fabio

3

que tenían una función jQuery que disparó contra $(document).ready() el cual detecta si había un hash adjunto a la dirección URL en mi caso, por lo que mantienen que la función de la misma y luego sólo se utiliza una recarga vigor siempre que un cambio de hash era detectado:

$(window).on('hashchange',function(){ 
    window.location.reload(true); 
}); 

Entonces mi otra función -

$(document).ready(function() { 
    var hash = window.location.hash;  
    if(hash) { 
      //DO STUFF I WANT TO DO WITH HASHES 
    } 
}); 

En mi caso, que estaba bien para UX - podría no ser bueno para otros.

+1

El evento listo de jQuery no se activará cuando 'ventana.location = "#myHash" 'se ejecuta, lo cual sería el punto en esta pregunta, creo. Sin embargo, este código es útil para cargar contenido dinámico, por ejemplo, si la página se vuelve a cargar. – JoeBrockhaus

0

Otra opción es eliminar el hash y almacenarlo en el almacenamiento de sesión para ser recuperado en recarga:

var newUrl = location.href + '#myHash'; 
var splitUrl = newUrl.split('#'); 
newUrl = splitUrl[0]; 
if (splitUrl[1]){ 
    sessionStorage.savedHash = splitUrl[1]; 
} 
location.href = newUrl; 

y luego en la parte superior de la página se puede tener el siguiente código:

var savedHash = sessionStorage.savedHash; 
if (savedHash){ 
    delete sessionStorage.savedHash; 
    location.hash = savedHash; 
} 
Cuestiones relacionadas