Como remover o hash de window.location (URL) com JavaScript sem atualização de página?

Eu tenho URL como: http://example.com#something , como removo #something , sem fazer com que a página seja atualizada?

Eu tentei a seguinte solução:

 window.location.hash = ''; 

No entanto, isso não remove o símbolo de hash # do URL.

   

    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 no window.location acionará uma atualização da página. Você pode alterar window.location.hash sem acionar a atualização (embora a janela salte se seu hash corresponder a um id na página), mas você não pode se livrar do sinal de hash. Faça a sua escolha para o que é pior …

    RESPOSTA MAIS UP-TO-DATE

    A resposta certa sobre como fazer isso sem sacrificar (seja recarregar completamente ou deixar o sinal de hash) está aqui embaixo . Deixando esta resposta aqui, porém, com respeito a ser o original em 2009, enquanto o correto, que aproveita novas APIs do navegador foi dado 1,5 anos depois.

    Resolver este problema é muito mais acessível 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, no Firefox 4, no Safari 5, no Opera 11.50 e no IE 10. Para navegadores sem suporte, você sempre pode escrever um script com degradação agradável que faça uso dele quando 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; } } 

    Então você pode se livrar do símbolo de hash, mas não em todos os navegadores – ainda.

    Nota: se você quiser replace a página atual no histórico do navegador, use replaceState() vez de pushState() .

    Simples e elegante:

     history.replaceState({}, document.title, "."); // replace / with . to keep url 

    Para remover o hash, você pode tentar usar esta function

     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 final 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 = ''; } 

    (Muitas respostas são redundantes e desatualizadas.) A melhor solução agora é esta:

     history.replaceState(null, null, ' '); 

    Como sobre o seguinte?

    window.location.hash=' '

    Por favor, note que estou definindo o hash para um único espaço e não uma string vazia.


    Definir o hash para uma âncora inválida também não causa uma atualização. Tal como,

    window.location.hash='invalidtag'

    Mas, acho que a solução acima é enganosa. Isso parece indicar que existe uma âncora na posição dada com o nome dado, embora não haja uma. Ao mesmo tempo, usar uma string vazia faz com que a página se mova para o topo, o que pode ser inaceitável às vezes. O uso de um espaço também garante que sempre que o URL for copiado, marcado e visitado novamente, a página geralmente estará no topo e o espaço será ignorado.

    E, ei, esta é minha primeira resposta no StackOverflow. Espero que alguém ache útil e que corresponda aos padrões da comunidade.

     const url = new URL(window.location); url.hash = ''; history.replaceState(null, document.title, url); 
      

    coloque este código na seção da cabeça

    Tente o seguinte:

     window.history.back(1); 

    Você pode replace o hash com nulo

     var urlWithoutHash = document.location.href.replace(location.hash , "" ); 

    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); 

    OBSERVAÇÃO: A API proposta agora faz parte do WhatWG HTML Living Standard