Actualizando la barra de direcciones con una nueva URL sin hash o recargando la página

646

Soñé con Chrome (canal de desarrollo) implementando una forma de actualizar la barra de direcciones a través de JavaScript (la ruta, no el dominio) sin volver a cargar la página o realmente lo han hecho.

Sin embargo, no puedo encontrar el artículo que creo haber leído.

¿Estoy loco o hay una manera de hacer esto (en Chrome)?

ps No estoy hablando de window.location.hash, et al. Si lo anterior existe, la respuesta a esta pregunta será falsa.

David Murdoch
fuente
3
Posible duplicado de Modificar la URL sin volver a cargar la página
Tobias Kienzler
1
@tobiaskienzler Cuando esa pregunta se hizo originalmente en 2009, no fue posible.
David Murdoch
3
Por supuesto no. Pero ahora es así, las preguntas piden lo mismo. Es una pena que el otro tenga una respuesta desactualizada aceptada (por ti, me di cuenta) ... ¿Sabes qué? Cerrémonos al revés, nadie dijo que el "original" tenía que ser el más antiguo, de hecho, hay precedentes
Tobias Kienzler
@tobiaskienzler, la otra pregunta no tiene una respuesta aceptada obsoleta.
David Murdoch
2
@TobiasKienzler es una pregunta de 6 años, ¿por qué tienes que molestarte con esta pregunta? Simplemente disfrute de la increíble respuesta e impleméntela en su aplicación. Durante 6 años, miles de usuarios de SO acordaron que es una pregunta sorprendente, déjenla como está.
Imam Assidiqqi

Respuestas:

876

¡Ahora puede hacer esto en la mayoría de los navegadores "modernos"!

Aquí está el artículo original que leí (publicado el 10 de julio de 2010): HTML5: Cambiar la URL del navegador sin actualizar la página .

Para obtener una visión más detallada de pushState / replaceState / popstate (también conocido como HTML5 History API), consulte los documentos de MDN .

TL; DR, puedes hacer esto:

window.history.pushState("object or string", "Title", "/new-url");

Vea mi respuesta para Modificar la URL sin volver a cargar la página para obtener un tutorial básico.

David Murdoch
fuente
3
Ah, la funcionalidad está en WebKit y aterrizó hace unos meses < bugs.webkit.org/show_bug.cgi?id=36152 >. Buen hallazgo!
oldlivingboy
66
github ahora usa esto, mientras que la navegación de árbol
Valerij
1
@Vprimachenko: Sí. Y rompen mi botón de retroceso de vez en cuando.
David Murdoch
¡Esto ahora se puede hacer en Chrome, Safari, FF4 + e IE10pp3 +! (De la respuesta de David Murdoch a stackoverflow.com/questions/824349/… )
Zach Lysobey
11
Protip: también puede usar rutas relativas con estas funciones (por ejemplo, ../new-urlo ../../new-url. Parecen hacer lo que usted esperaría en Chrome al menos.)
Mahn
157

Cambiar solo lo que está después del hash - navegadores antiguos

document.location.hash = 'lookAtMeNow';

Cambio de URL completa. Chrome, Firefox, IE10 +

history.pushState('data to be passed', 'Title of the page', '/test');

Lo anterior agregará una nueva entrada al historial para que pueda presionar el botón Atrás para ir al estado anterior. Para cambiar la URL en su lugar sin agregar una nueva entrada al historial, use

history.replaceState('data to be passed', 'Title of the page', '/test');

¡Intenta ejecutarlos en la consola ahora!

Pawel
fuente
13
replaceStateera exactamente lo que necesitaba, gracias por ampliar la respuesta original.
Choylton B. Higginbottom
'¡el dominio y el protocolo deben ser los mismos que los originales!' Esto evita que algún sitio de pesca cambie la URL de la barra de direcciones.
Rick
3
No debe pasar una URL absoluta a esta función. Si lo hace, lo más probable es que necesite compilarlo dinámicamente a partir del esquema actual, el host y el puerto, lo que es mucho trabajo cuando podría simplemente convertirlo en una URL relativa ("foo.html" o incluso "/foo.html ") y deje que el navegador se encargue de ello.
DimeCadmium
1
@DimeCadmium agradable simplificación. Actualizado.
Pawel
history.replaceStateagregar a la historia en ff 66.0b1
azzamsa
33

La actualización de Davids responde incluso para detectar navegadores que no admiten pushstate:

if (history.pushState) {
  window.history.pushState("object or string", "Title", "/new-url");
} else {
  document.location.href = "/new-url";
}
metamagikum
fuente
99
document.location.href vuelve a cargar la página
paullb
1
var newurl = window.location.protocol + "//" + window.location.host + window.location.pathname + '?foo=bar';
window.history.pushState({path:newurl},'',newurl);
Kevin Mendez
fuente
44
Si bien este fragmento de código puede resolver la pregunta, incluir una explicación realmente ayuda a mejorar la calidad de su publicación. Recuerde que está respondiendo la pregunta para los lectores en el futuro, y que esas personas podrían no conocer los motivos de su sugerencia de código.
MaxiMouse
@MaxiMouse gracias por su sugerencia, lo tendré en cuenta.
Kevin Mendez