2011-01-17 16 views
18

en mi sitio web que establezca la dirección URL utilizandowindow.location.hash = ""; evitar desplazarse hacia la parte superior?

window.location.hash = 'project_name'; 

pero si quiero limpiar la url dirección de cualquier hashes (cuando cierro un proyecto) y me puse

window.location.hash = ''; 

ocurre lo la página se desplaza hasta la página superior

hay alguna forma de limpiar la url sin ningún efecto secundario?

gracias

+0

podría asignar un no-existente de anclaje, pero eso no es verdad "limpieza" de la URL arriba: D ... – polarblau

Respuesta

28

Ahí está el caso onhashchange, pero no se puede cancelar de forma fiable a través de navegadores para evitar el desplazamiento. La mejor solución es registrar la posición de desplazamiento antes de cambiar la ubicación de hash y restablecerla después. Por ejemplo, el siguiente código se captura un clic en cualquier enlace - que no se detiene la propagación - con un valor de href # y evitar que la página de desplazamiento vertical:

document.onclick = function (evt) { 
    var tgt = (evt && evt.target) || event.srcElement, 
     scr = document.body.scrollTop; 

    if (tgt.tagName == "A" && tgt.href.slice(-1) == "#") { 
     window.location.href = "#"; 
     document.body.scrollTop = scr;   
     return false; 
    } 
} 

Si va a modificar el hash a través secuencia de comandos, puede utilizar el siguiente código:

var scr = document.body.scrollTop; 
window.location.href = '#'; 
document.body.scrollTop = scr; 

Cualquiera de estos métodos puede ser regulada para evitar el desplazamiento de elementos individuales o el desplazamiento horizontal de la página. Tenga en cuenta que puederemove the entire hash (incluido el #) sin causar navegación o desplazamiento en navegadores modernos llamando a las funciones pushState o replaceState.

+1

interesante todos los días aprendo algo! gracias – Francesco

+0

También puede crear temporalmente otro elemento con ese 'id' en el' scrollTop'. – alex

+0

fyi, no está funcionando en Firefox y solo la mayor parte del tiempo en Chrome.Se pone en la función ohhashchange, pero el navegador todavía se desplaza (también se intentó evitar el valor predeterminado). – JCarter

12

Estaba teniendo el mismo problema y vine a buscar una respuesta. Acaba de descubrir que hay una manera muy fácil:

window.location.hash = ' '; 

Básicamente se están estableciendo a '#', ya que no existe el espacio, que no se mueve. Cuando vuelve a visitar la página, tampoco la trata de manera diferente a solo #

+0

Esto debería haber aceptado la cuestión, en mi opinión – Nico

+1

s/pregunta/respuesta/ – nicolallias

+0

buena solución, pero que no funciona en Chrome 46 – meteor

8

Primero, gracias por sus soluciones - @ Andy-E y @JustMaier.

Sin embargo, tuve un problema para hacerlo funcionar basado en el segundo bloque de código de Andy E en Firefox y el código de JustMaier en Chrome.

Así que hice un puré de esos dos bloques de código y funciona como se pretende en ambos navegadores

var scr = document.body.scrollTop; 

window.location.hash = ' '; 

document.body.scrollTop = scr; 


Mis dos centavos, tomando nada lejos de los ninjas reales JS, mencionado anteriormente. :)

0

document.body.scrollTop is deprecated, también las últimas versiones de Chrome parecen ser inestables aquí. El siguiente debe funcionar:

var topPos = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0; 
    window.location.href = '#'; 
    document.documentElement.scrollTop = topPos; 
Cuestiones relacionadas