Estoy creando una galería de fotos y me gustaría poder cambiar la cadena de consulta y el título cuando se examinan las fotos.
El comportamiento que estoy buscando se ve a menudo con algunas implementaciones de página continua / infinita, donde mientras se desplaza hacia abajo, la cadena de consulta sigue aumentando el número de página ( http://x.com?page=4 ), etc. Esto debería ser simple en teoría, pero me gustaría algo que sea seguro en los principales navegadores.
Encontré esta gran publicación y estaba tratando de seguir el ejemplo de window.history.pushstate
, pero eso no parece funcionar para mí. Y no estoy seguro de si es ideal porque realmente no me importa modificar el historial del navegador.
Solo quiero poder ofrecer la posibilidad de marcar la foto que se está viendo actualmente, sin tener que volver a cargar la página cada vez que se cambia la foto.
Aquí hay un ejemplo de página infinita que modifica la cadena de consulta: http://tumbledry.org/
UPDATE encontró este método:
window.location.href = window.location.href + '#abc';
parece funcionar para mí, pero estoy en un nuevo Chrome ... ¿probablemente causaría algunos problemas con los navegadores más antiguos?
fuente
:)
Respuestas:
Si está buscando una modificación de Hash, su solución funciona bien. Sin embargo, si desea cambiar la consulta, puede usar pushState, como dijo. Aquí hay un ejemplo que puede ayudarlo a implementarlo correctamente. Probé y funcionó bien:
No recarga la página, pero solo le permite cambiar la consulta de URL. No podrá cambiar el protocolo o los valores de host. Y, por supuesto, requiere navegadores modernos que puedan procesar la API de historial de HTML5.
Para más información:
http://diveintohtml5.info/history.html
https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history
fuente
window.location.protocol + '//' + window.location.host
a solo:window.location.origin
.history.pushState()
. Tampocostate
se requiere ningún argumento real . Ambos significan que puede hacer algo simple, comohistory.pushState(null, '', '/foo?bar=true')
si su nueva URL está en el mismo host / puerto.history.replaceState()
con los mismos argumentos.if (window.history.pushState) { const newURL = new URL(window.location.href); newURL.search = '?myNewUrlQuery=1'; window.history.pushState({ path: newURL.href }, '', newURL.href); }
A partir de la respuesta de Fabio, creé dos funciones que probablemente serán útiles para cualquiera que se encuentre con esta pregunta. Con estas dos funciones, puede llamar
insertParam()
con una clave y un valor como argumento. Agregará el parámetro de URL o, si ya existe un parámetro de consulta con la misma clave, cambiará ese parámetro al nuevo valor:fuente
new URLSearchParams()
con sus métodos nativos configurados y eliminados ? en cualquier caso debemos ponerlo en la historia conhistory.pushState()
new URLSearchParams()
no es compatible con ninguna versión de IEHe utilizado la siguiente biblioteca de JavaScript con gran éxito:
https://github.com/balupton/jquery-history
Es compatible con la API de historial de HTML5, así como con un método alternativo (usando #) para navegadores más antiguos.
Esta biblioteca es esencialmente un polyfill alrededor de `history.pushState '.
fuente
Quiero mejorar la respuesta de Fabio y crear una función que agregue una clave personalizada a la cadena de URL sin volver a cargar la página.
fuente
Entonces la API de historial es exactamente lo que está buscando. Si también desea admitir navegadores heredados, busque una biblioteca que se base en la manipulación de la etiqueta hash de la URL si el navegador no proporciona la API de historial.
fuente