Estou criando uma galeria de fotos e gostaria de poder alterar a string de consulta e o título quando as fotos forem navegadas.
O comportamento que estou procurando é frequentemente visto com algumas implementações de página contínua / infinita, onde enquanto você rola para baixo a string de consulta continua incrementando o número da página ( http://x.com?page=4 ) etc. Isso deve ser simples em teoria, mas eu gostaria de algo que fosse seguro nos principais navegadores.
Eu encontrei este ótimo post , e estava tentando seguir o exemplo com window.history.pushstate
, mas isso não parece estar funcionando para mim. E não tenho certeza se é ideal porque realmente não me importo em modificar o histórico do navegador.
Só quero oferecer a capacidade de marcar a foto exibida no momento, sem recarregar a página toda vez que a foto for alterada.
Aqui está um exemplo de página infinita que modifica a string de consulta: http://tumbledry.org/
UPDATE encontrou este método:
window.location.href = window.location.href + '#abc';
parece funcionar para mim, mas estou em um novo cromo ... provavelmente causaria alguns problemas com navegadores mais antigos?
fonte
:)
Respostas:
Se você está procurando por modificação de Hash, sua solução funciona bem. No entanto, se você quiser alterar a consulta, pode usar o pushState, como você disse. Aqui está um exemplo que pode ajudá-lo a implementá-lo corretamente. Eu testei e funcionou bem:
Não recarrega a página, mas apenas permite que você altere a consulta de URL. Você não seria capaz de alterar o protocolo ou os valores do host. E, claro, requer navegadores modernos que possam processar a API HTML5 History.
Para maiores informações:
http://diveintohtml5.info/history.html
https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history
fonte
window.location.protocol + '//' + window.location.host
para apenas:window.location.origin
.history.pushState()
. Nenhumstate
argumento real é necessário. Ambos significam que você pode fazer algo simples, comohistory.pushState(null, '', '/foo?bar=true')
se sua nova url estiver no mesmo host / porta.history.replaceState()
com os mesmos argumentos.if (window.history.pushState) { const newURL = new URL(window.location.href); newURL.search = '?myNewUrlQuery=1'; window.history.pushState({ path: newURL.href }, '', newURL.href); }
Partindo da resposta de Fabio, criei duas funções que provavelmente serão úteis para quem tiver essa pergunta. Com essas duas funções, você pode chamar
insertParam()
com uma chave e um valor como argumento. Ele adicionará o parâmetro de URL ou, se já existir um parâmetro de consulta com a mesma chave, mudará esse parâmetro para o novo valor:fonte
new URLSearchParams()
com seus métodos nativos como definir e excluir ? em ambos os casos, devemos colocá-lo para a história comhistory.pushState()
new URLSearchParams()
não é compatível com nenhuma versão do IEUsei a seguinte biblioteca JavaScript com grande sucesso:
https://github.com/balupton/jquery-history
Ele suporta a API de histórico HTML5, bem como um método de fallback (usando #) para navegadores mais antigos.
Esta biblioteca é essencialmente um polyfill em torno de `history.pushState '.
fonte
Eu quero melhorar a resposta do Fabio e criar uma função que adiciona uma chave personalizada à string do URL sem recarregar a página.
fonte
Então, a API de histórico é exatamente o que você está procurando. Se você deseja oferecer suporte a navegadores legados também, procure uma biblioteca que use a manipulação da hashtag da URL se o navegador não fornecer a API de histórico.
fonte