¿Cómo puedo verificar si una URL ha cambiado en JavaScript? Por ejemplo, sitios web como GitHub, que usan AJAX, agregarán información de la página después de un símbolo # para crear una URL única sin volver a cargar la página. ¿Cuál es la mejor manera de detectar si esta URL cambia?
- ¿Se
onload
vuelve a llamar el evento? - ¿Hay un controlador de eventos para la URL?
- ¿O debe comprobarse la URL cada segundo para detectar un cambio?
javascript
ajax
AJ00200
fuente
fuente
Respuestas:
En los navegadores modernos (IE8 +, FF3.6 +, Chrome), puede escuchar el
hashchange
evento enwindow
.En algunos navegadores antiguos, necesita un temporizador que verifique continuamente
location.hash
. Si está utilizando jQuery, hay un complemento que hace exactamente eso.fuente
beforeunload
evento. Si su código inició el cambio de URL, lo sabe mejor.Quería poder agregar
locationchange
oyentes de eventos. Después de la modificación a continuación, podremos hacerlo, asíPor el contrario,
window.addEventListener('hashchange',()=>{})
solo se dispararía si la parte después de un hashtag en una url cambia, ywindow.addEventListener('popstate',()=>{})
no siempre funciona.Esta modificación, similar a la respuesta de Christian , modifica el objeto de historia para agregar alguna funcionalidad.
Por defecto, hay un
popstate
evento, pero no hay eventos parapushstate
, yreplacestate
.Esto modifica estas tres funciones, para que todo el fuego una costumbre
locationchange
evento para que usted pueda usar, y tambiénpushstate
yreplacestate
eventos si desea utilizar los:fuente
usa este código
con jQuery
fuente
EDITAR después de un poco de investigación:
De alguna manera parece que me ha engañado la documentación presente en los documentos de Mozilla. El
popstate
evento (y su función de devolución de llamadaonpopstate
) se no se activan cada vez que elpushState()
oreplaceState()
reciben el nombre en clave. Por lo tanto, la respuesta original no se aplica en todos los casos.Sin embargo, hay una manera de evitar esto parcheando las funciones según @ alpha123 :
Respuesta original
Dado que el título de esta pregunta es " Cómo detectar el cambio de URL ", la respuesta, cuando desea saber cuándo cambia la ruta completa (y no solo el ancla de hash), es que puede escuchar el
popstate
evento:Referencia para popstate en Mozilla Docs
Actualmente (enero de 2017) hay soporte para popstate del 92% de los navegadores en todo el mundo.
fuente
Con jquery (y un complemento) puedes hacer
http://benalman.com/projects/jquery-hashchange-plugin/
De lo contrario, sí, tendría que usar setInterval y buscar un cambio en el evento hash (window.location.hash)
¡Actualizar! Un borrador simple
fuente
window.addEventListener("hashchange", hashChanged);
detect()
función?¡Agregue un detector de eventos de cambio hash!
O, para escuchar todos los cambios de URL:
Esto es mejor que algo como el código a continuación porque solo puede existir una cosa en window.onhashchange y posiblemente sobrescribirá el código de otra persona.
fuente
esta solución me funcionó:
fuente
setInterval
asetTimeout
: "el uso de setInterval () detendrá el navegador después de un tiempo, porque creará una nueva llamada a checkURLchange () cada segundo. setTimeout () es la solución correcta, porque se llama solo una vez ".setTimeout
como sugiere @divibisan, mueva elsetInterval
exterior de la función.checkURLchange();
También se convierte en opcional.Aunque es una vieja pregunta, el proyecto de la barra de ubicación es muy útil.
fuente
Para escuchar los cambios de URL, consulte a continuación:
Use este estilo si tiene la intención de detener / eliminar el oyente después de cierta condición.
fuente
Mientras hacía una pequeña extensión de Chrome, enfrenté el mismo problema con un problema adicional: veces, la página cambia pero no la URL.
Por ejemplo, solo vaya a la página de inicio de Facebook y haga clic en el botón 'Inicio'. Volverá a cargar la página, pero la URL no cambiará (estilo de aplicación de una página).
El 99% del tiempo, estamos desarrollando sitios web para que podamos obtener esos eventos de Frameworks como Angular, React, Vue, etc.
PERO , en mi caso de una extensión de Chrome (en Vanilla JS), tuve que escuchar un evento que se disparará para cada "cambio de página", que generalmente puede ser detectado por el cambio de URL, pero a veces no.
Mi solución casera fue la siguiente:
Básicamente, la solución de Leoneckert, aplicada al historial de ventanas, que cambiará cuando una página cambie en una sola aplicación de página.
No encontré la ciencia de cohetes, sino la solución más limpia, teniendo en cuenta que aquí solo estamos verificando una igualdad de enteros, y no objetos más grandes o todo el DOM.
fuente
window.history
tiene una longitud máxima de 50 (al menos a partir de Chrome 80). Después de ese punto,window.history.length
siempre devuelve 50. Cuando eso sucede, este método no reconocerá ningún cambio.Mire la función de descarga de jQuery. Maneja todas las cosas.
https://api.jquery.com/unload/
fuente
fuente
La respuesta a continuación viene de aquí (con la sintaxis antigua de JavaScript (sin función de flecha, compatible con IE 10+)): https://stackoverflow.com/a/52809105/9168962
fuente
Otra forma sencilla de hacerlo es agregando un evento de clic, a través de un nombre de clase a las etiquetas de anclaje en la página para detectar cuándo se ha hecho clic, y ahora puede usar window.location.href para obtener los datos de URL que puede usar para ejecutar su solicitud ajax al servidor. Simple y fácil.
fuente
Está comenzando una nueva
setInterval
en cada llamada, sin cancelar la anterior, probablemente solo quería tener unsetTimeout
fuente