¿Hay alguna manera de modificar la URL de la página actual sin volver a cargar la página?
Me gustaría acceder a la porción antes del # hash si es posible.
Solo necesito cambiar la porción después del dominio, por lo que no es que esté violando las políticas entre dominios.
window.location.href = "www.mysite.com/page2.php"; // Sadly this reloads
javascript
html
url
url-rewriting
friendly-url
El flash
fuente
fuente
history.pushState()
es probablemente la respuesta correcta aquí, en esta situación (dependiendo de las circunstancias exactas ...) la posibilidad de usar una redirección del lado del servidor (como mediante el uso de la directiva RewriteRule de Apache) es algo que quizás desee considerar, o al menos ser consciente de. ¡Solo pensé que debería mencionarse!Respuestas:
¡Esto ahora se puede hacer en Chrome, Safari, Firefox 4+ e Internet Explorer 10pp4 +!
Consulte la respuesta de esta pregunta para obtener más información: Actualización de la barra de direcciones con nueva URL sin hash o recarga de la página
Ejemplo:
Luego puede usar
window.onpopstate
para detectar el botón de navegación hacia atrás / adelante:Para obtener una visión más detallada sobre la manipulación del historial del navegador, consulte este artículo de MDN .
fuente
HTML5 introdujo los métodos
history.pushState()
yhistory.replaceState()
, que le permiten agregar y modificar entradas del historial, respectivamente.Lea más sobre esto desde aquí
fuente
file:///
por razones de seguridad, por ejemplo, Firefox 30. Pruebelocalhost
conpython -m SimpleHTTPServer
.También puede usar HTML5 replaceState si desea cambiar la URL pero no desea agregar la entrada al historial del navegador:
Esto 'rompería' la funcionalidad del botón de retroceso. Esto puede ser necesario en algunos casos, como una galería de imágenes (donde desea que el botón Atrás regrese a la página de índice de la galería en lugar de retroceder a través de todas y cada una de las imágenes que vio) mientras le da a cada imagen su propia URL única.
fuente
Aquí está mi solución (newUrl es su nueva URL que desea reemplazar con la actual):
fuente
NOTA: Si está trabajando con un navegador HTML5, debe ignorar esta respuesta. Esto ahora es posible como se puede ver en las otras respuestas.
No hay forma de modificar la URL en el navegador sin volver a cargar la página. La URL representa la última página cargada. Si lo cambias (
document.location
), volverá a cargar la página.Una razón obvia es que usted escribe un sitio
www.mysite.com
que parece una página de inicio de sesión bancaria. Luego cambia la barra de URL del navegador para decirwww.mybank.com
. El usuario ignorará totalmente lo que realmente está mirandowww.mysite.com
.fuente
fuente
En los navegadores modernos y HTML5 , hay un método llamado
pushState
en la ventanahistory
. Eso cambiará la URL y la enviará al historial sin cargar la página.Puede usarlo así, tomará 3 parámetros, 1) objeto de estado 2) título y una URL):
Esto cambiará la URL, pero no volverá a cargar la página. Además, no comprueba si la página existe, por lo que si hace algún código JavaScript que reacciona a la URL, puede trabajar con ellos de esta manera.
También hay
history.replaceState()
quien hace exactamente lo mismo, excepto que modificará el historial actual en lugar de crear uno nuevo!También puede crear una función para verificar si
history.pushState
existe, luego continuar con el resto de esta manera:También puede cambiar el
#
for<HTML5 browsers
, que no volverá a cargar la página. Así es como Angular usa para hacer SPA según el hashtag ...Cambiar
#
es bastante fácil, haciendo como:Y puedes detectarlo así:
fuente
window.onhashchange
ywindow.onpopstate
haría lo mismo en este caso?El HTML5 replaceState es la respuesta, como ya lo mencionaron Vivart y geo1701. Sin embargo, no es compatible con todos los navegadores / versiones. History.js incluye características de estado HTML5 y proporciona soporte adicional para navegadores HTML4.
fuente
Antes de HTML5 podemos usar:
y:
Este método volverá a cargar su página, pero HTML5 introdujo el
history.pushState(page, caption, replace_url)
que no debería volver a cargar su página.fuente
history.pushState(..)
es que si desea redirigir a otro dominio, la política de dominio cruzado entrará en vigencia. Mientras que con lawindow.location.replace(..)
redirección a otro dominio es posible.Si lo que intenta hacer es permitir que los usuarios marquen / compartan páginas, y no necesita que sea exactamente la URL correcta, y no está utilizando anclas hash para nada más, puede hacerlo en dos partes; usa el archivo location.hash mencionado anteriormente y luego implementa una verificación en la página de inicio para buscar una URL con un ancla de hash y redirigirlo al resultado posterior.
Por ejemplo:
1) El usuario está encendido
www.site.com/section/page/4
2) El usuario realiza alguna acción que cambia la URL a
www.site.com/#/section/page/6
(con el hash). Supongamos que ha cargado el contenido correcto para la página 6 en la página, por lo que, aparte del hash, el usuario no se molesta demasiado.3) El usuario pasa esta URL a otra persona o la marca como favorita
4) Alguien más, o el mismo usuario en una fecha posterior, va a
www.site.com/#/section/page/6
5) El código en
www.site.com/
redirige al usuariowww.site.com/section/page/6
, usando algo como esto:Espero que tenga sentido! Es un enfoque útil para algunas situaciones.
fuente
A continuación se muestra la función para cambiar la URL sin volver a cargar la página. Solo es compatible con HTML5.
fuente
Cualquier cambio en la ubicación (ya sea
window.location
odocument.location
) causará una solicitud en esa nueva URL, si no solo está cambiando el fragmento de URL. Si cambia la URL, cambia la URL.Utilice técnicas de reescritura de URL del lado del servidor como mod_rewrite de Apache si no le gustan las URL que está utilizando actualmente.
fuente
Puede agregar etiquetas de anclaje. Lo uso en mi sitio para poder rastrear con Google Analytics lo que la gente visita en la página.
Solo agrego una etiqueta de anclaje y luego la parte de la página que quiero rastrear:
fuente
Como señaló Thomas Stjernegaard Jeppesen, podría usar History.js para modificar los parámetros de URL mientras el usuario navega a través de sus enlaces y aplicaciones Ajax.
Ha pasado casi un año desde esa respuesta, y History.js creció y se volvió más estable y de navegador cruzado. Ahora se puede usar para administrar estados de historial en HTML5 compatible, así como en muchos navegadores solo HTML4. En esta demostración , puede ver un ejemplo de cómo funciona (además de poder probar sus funcionalidades y límites.
Si necesita ayuda sobre cómo usar e implementar esta biblioteca, le sugiero que consulte el código fuente de la página de demostración: verá que es muy fácil de hacer.
Finalmente, para obtener una explicación completa de cuáles pueden ser los problemas relacionados con el uso de hash (y hashbangs), consulte este enlace de Benjamin Lupton.
fuente
Uso
history.pushState()
de la API de historial HTML 5.Consulte la API de historial HTML5 para obtener más detalles.
fuente
Puede utilizar esta función hermosa y simple para hacerlo en cualquier lugar de su aplicación.
No solo puede editar la URL, sino que también puede actualizar el título junto con ella.
Muy útil para todos.
fuente
window.history.pushState('data', 'Title', '#new_location');