Receio que seja impossível, mas existe uma maneira de alterar o valor hash de um URL sem deixar uma entrada no histórico do navegador e sem recarregar ? Ou faça o equivalente?
No que diz respeito às especificações, eu estava desenvolvendo uma navegação básica de hash ao longo das linhas de:
//hash nav -- works with js-tabs
var getHash = window.location.hash;
var hashPref = "tab-";
function useHash(newHash) {
//set js-tab according to hash
newHash = newHash.replace('#'+hashPref, '');
$("#tabs li a[href='"+ newHash +"']").click();
}
function setHash(newHash) {
//set hash according to js-tab
window.location.hash = hashPref + newHash;
//THIS IS WHERE I would like to REPLACE the location.hash
//without a history entry
}
// ... a lot of irrelavent tabs js and then....
//make tabs work
$("#tabs.js-tabs a").live("click", function() {
var showMe = $(this).attr("href");
$(showMe).show();
setHash(showMe);
return false;
});
//hash nav on ready .. if hash exists, execute
if ( getHash ){
useHash(getHash);
}
Usando jQuery, obviamente. A ideia é que , neste caso específico 1) fazer o usuário voltar a cada mudança de guia poderia efetivamente 'quebrar o botão Voltar' acumulando referências desnecessárias e 2) não reter em qual guia ele está atualmente se clicar em atualizar é um aborrecimento.
Respostas:
location.replace("#hash_value_here");
funcionou bem para mim até descobrir que não funciona no IOS Chrome. Nesse caso, use:Lembre-se de guardar o
#
ou a última parte do url será alterada.fonte
window.location.hash = 'my-hash';
seguido dehistory.replaceState(undefined, undefined, "#my-hash")
?history.replaceState
diferelocation.replace
?O acima parece fazer o que você procura.
fonte
window.location.replace(('' + window.location).split('#')[0] + '#' + hash);
apenas para atualizar o hash<base href ="http://example.com/" />
Se contiver uma tag de base , então quando você usar o método replace com apenas um inicial"#hash_value_here"
, será como se você dissesse `location.replace (' example.com/#hash_value_here' ). Isso parece óbvio quando você lê aqui, mas é um problema quando você está em uma página com um fragmento de caminho e não percebe que a base está definida.Edit: Já se passaram alguns anos e os navegadores evoluíram.
A resposta de @Luxiyalu é o caminho a percorrer
- Resposta Antiga -
Eu também acho que é impossível (neste momento). Mas por que você precisa alterar o valor de hash se não vai usá-lo?
Acredito que o principal motivo pelo qual usamos o valor hash como programadores é para permitir que o usuário marque nossas páginas ou para salvar um estado no histórico do navegador. Se você não quiser fazer nada disso, basta salvar o estado em uma variável e trabalhar a partir daí.
Acho que o motivo de usar um hash é trabalhar com um valor que está fora de nosso controle. Se você não precisa disso, provavelmente significa que tem tudo sob seu controle, então apenas armazene o estado em uma variável e trabalhe com ele. (Eu gosto de me repetir)
Espero que isso ajude você. Talvez haja uma solução mais fácil para o seu problema.
ATUALIZAÇÃO: Que tal:
window.history.back(1)
, isso fará com que o histórico volte a partir do seu primeiro hash init.Você provavelmente terá que usar alguns sinalizadores para saber se a entrada atual pode ser "excluída" voltando ou se você simplesmente pula o primeiro passo. E para ter certeza, que seu método de carregamento para o "hash" não execute, quando você força o
history.back
.fonte
?mystate=greatness
), embora não precise ser ajax, você poderia salvar informações para o javascript ler ao inicializar a solicitação.Você sempre pode criar um ouvinte de evento para capturar eventos de clique no hiperlink e na função de retorno de chamada colocar e.preventDefault (), que deve impedir o navegador de inseri-lo no histórico.
fonte