Tenho URL como:, http://example.com#something
como faço para remover #something
, sem fazer com que a página seja atualizada?
Tentei a seguinte solução:
window.location.hash = '';
No entanto, isso não remove o símbolo de hash #
do URL.
Tenho URL como:, http://example.com#something
como faço para remover #something
, sem fazer com que a página seja atualizada?
Tentei a seguinte solução:
window.location.hash = '';
No entanto, isso não remove o símbolo de hash #
do URL.
Respostas:
Questão inicial:
window.location.href.substr(0, window.location.href.indexOf('#'))
ou
window.location.href.split('#')[0]
ambos retornarão o URL sem o hash ou qualquer coisa depois dele.
Com relação à sua edição:
Qualquer alteração em window.location
irá acionar uma atualização da página. Você pode alterar window.location.hash
sem acionar a atualização (embora a janela salte se o seu hash corresponder a um ID na página), mas você não poderá se livrar do sinal de hash. Faça a sua escolha para o que é pior ...
RESPOSTA MAIS ATUALIZADA
A resposta certa sobre como fazê-lo sem sacrificar (recarregar completamente ou deixar o sinal de hash lá) está aqui embaixo . Deixando essa resposta aqui, porém, em relação a ser a original em 2009, a correta que utiliza novas APIs de navegador foi dada 1,5 anos depois.
A solução desse problema está muito mais ao alcance hoje em dia. A API de histórico do HTML5 nos permite manipular a barra de localização para exibir qualquer URL no domínio atual.
function removeHash () {
history.pushState("", document.title, window.location.pathname
+ window.location.search);
}
Demonstração de trabalho: http://jsfiddle.net/AndyE/ycmPt/show/
Isso funciona no Chrome 9, Firefox 4, Safari 5, Opera 11.50 e no IE 10. Para navegadores não suportados, você sempre pode escrever um script degradante que o utilize sempre que disponível:
function removeHash () {
var scrollV, scrollH, loc = window.location;
if ("pushState" in history)
history.pushState("", document.title, loc.pathname + loc.search);
else {
// Prevent scrolling by storing the page's current scroll offset
scrollV = document.body.scrollTop;
scrollH = document.body.scrollLeft;
loc.hash = "";
// Restore the scroll offset, should be flicker free
document.body.scrollTop = scrollV;
document.body.scrollLeft = scrollH;
}
}
Assim, você pode se livrar do símbolo de hash, mas não em todos os navegadores - ainda.
Nota: se você deseja substituir a página atual no histórico do navegador, use em replaceState()
vez de pushState()
.
(Muitas respostas são redundantes e desatualizadas.) A melhor solução agora é a seguinte:
history.replaceState(null, null, ' ');
history.pushState(null, null, ' ')
se você quiser preservar o histórico.
null
pelos parâmetros state
e title
faz.
Simples e elegante:
history.replaceState({}, document.title, "."); // replace / with . to keep url
.
vez de /
. Usar /
altera o URL para o caminho raiz.
history.replaceState({}, document.title, location.href.substr(0, location.href.length-location.hash.length));
para o meu caso de uso.
history.replaceState(null, document.title, location.pathname + location.search);
Para remover o hash, você pode tentar usar esta função
function remove_hash_from_url()
{
var uri = window.location.toString();
if (uri.indexOf("#") > 0) {
var clean_uri = uri.substring(0, uri.indexOf("#"));
window.history.replaceState({}, document.title, clean_uri);
}
}
Isso removerá o hash à direita também. por exemplo: http://test.com/123#abc -> http://test.com/123
if(window.history.pushState) {
window.history.pushState('', '/', window.location.pathname)
} else {
window.location.hash = '';
}
Que tal o seguinte?
window.location.hash=' '
Observe que estou configurando o hash para um espaço único e não para uma string vazia.
Definir o hash como uma âncora inválida também não causa atualização. Tal como,
window.location.hash='invalidtag'
Mas, acho a solução acima enganosa. Isso parece indicar que há uma âncora na posição fornecida com o nome dado, embora não exista. Ao mesmo tempo, o uso de uma string vazia faz com que a página seja movida para o topo, o que pode ser inaceitável às vezes. O uso de um espaço também garante que sempre que a URL for copiada, marcada e visitada novamente, a página geralmente estará na parte superior e o espaço será ignorado.
E, ei, esta é minha primeira resposta no StackOverflow. Espero que alguém ache útil e corresponda aos padrões da comunidade.
const url = new URL(window.location);
url.hash = '';
history.replaceState(null, document.title, url);
<script type="text/javascript">
var uri = window.location.toString();
if (uri.indexOf("?") > 0) {
var clean_uri = uri.substring(0, uri.indexOf("?"));
window.history.replaceState({}, document.title, clean_uri);
}
</script>
coloque esse código na seção principal
function removeLocationHash(){
var noHashURL = window.location.href.replace(/#.*$/, '');
window.history.replaceState('', document.title, noHashURL)
}
window.addEventListener("load", function(){
removeLocationHash();
});
Eu acho que seria mais seguro
if (window.history) {
window.history.pushState('', document.title, window.location.href.replace(window.location.hash, ''));
} else {
window.location.hash = '';
}
Tente o seguinte:
window.history.back(1);
Aqui está outra solução para alterar o local usando href e limpar o hash sem rolar.
A solução mágica é explicada aqui . Especificações aqui .
const hash = window.location.hash;
history.scrollRestoration = 'manual';
window.location.href = hash;
history.pushState('', document.title, window.location.pathname);
NOTA: A API proposta agora faz parte do WhatWG HTML Living Standard
$(window).on('hashchange', function (e) {
history.replaceState("", document.title, e.originalEvent.oldURL);
});
Você pode substituir o hash por nulo
var urlWithoutHash = document.location.href.replace(location.hash , "" );