Diferença entre window.location.href, window.location.replace e window.location.assign

128

Qual é a diferença entre

  1. window.location.href="http://example.com";
  2. window.location.replace("http://example.com");
  3. window.location.assign("http://example.com");

Eu li em muitos fóruns que window.location.assign()apenas substitui o histórico da sessão atual e, portanto, o botão voltar do navegador não funcionará. No entanto, não sou capaz de reproduzir isso.

function fnSetVariable() {
    //window.location.href = "http://example.com";
    window.location.replace("http://example.com");
    //window.location.assign("http://example.com");
}

<a onmouseover="fnSetVariable();" 
   href="PageCachingByParam.aspx?id=12" >
   CLICK 
</a>
milan_9211
fonte
1
Você pode ver um posto mais velho na url: stackoverflow.com/questions/1865837/... espero que seja útil
Aqui está uma explicação melhor: stackoverflow.com/a/847130/96656
Mathias Bynens

Respostas:

165

Eles fazem a mesma coisa:

window.location.assign(url);
window.location = url;
window.location.href = url;

Eles simplesmente navegam para o novo URL. O replacemétodo, por outro lado, navega para o URL sem adicionar um novo registro ao histórico.

Portanto, o que você leu nessas muitas formas não está correto. O assignmétodo adiciona um novo registro ao histórico.

Referência: http://developer.mozilla.org/en/window.location

Guffa
fonte
1
Muito obrigado pela resposta. Isso me ajudou muito a resolver o problema do botão Voltar do navegador.
Santosh Kumar patro
@blunderboy: De qualquer maneira, é a melhor resposta de um deslizamento de terra, para que não mude nada.
BoltClock
Então, qual é o sentido assign()? A partir desta resposta e dos documentos, parece idêntico a location = ....
Mitya 28/05
11

A parte de não poder usar o botão Voltar é uma má interpretação comum. window.location.replace (URL) lança a entrada ONE superior da lista de histórico da página, substituindo-a pela nova entrada, para que o usuário não possa voltar facilmente para a página específica do ONE. A função NÃO limpa toda a lista de histórico da página, nem torna o botão Voltar completamente inoperante.

(Nenhuma função ou combinação de parâmetros que eu conheço pode alterar ou substituir entradas da lista de histórico que você não possui absolutamente por certo - os navegadores geralmente aumentam essa limitação de segurança, simplesmente nem mesmo definindo qualquer operação que possa afetar qualquer entrada que não seja o primeiro da lista de histórico de páginas.Eu tremo ao pensar que tipo de coisas ruins o malware poderia fazer se essa função existisse.)

Se você realmente deseja tornar o botão Voltar inoperante (provavelmente não é "amigável": pense novamente se realmente é o que você quer fazer), "abra" uma nova janela. (Você pode "abrir" um pop-up que nem tem um botão "Voltar" também ... mas os pop-ups não são muito populares hoje em dia :-) Se você quiser manter sua página exibida, não importa o que o usuário faça ( novamente a "facilidade de uso" é questionável), configure um manipulador window.onunload que apenas recarrega sua página mais uma vez, limpo desde o início, sempre.

Chuck Kollars
fonte
4
'Nenhuma função ou combinação de parâmetros que eu conheço pode alterar ou substituir entradas da lista de histórico' ... Bem-vindo ao HTML5
SpYk3HH
6
A incapacidade de alterar ou substituir entradas do histórico do navegador que você não possui é uma regra de segurança que existe há muito tempo. O HTML5 simplesmente continua essa regra.
Chuck Kollars
Você errou o ponto ou sarcasmo. Procure html5 e histórico
SpYk3HH 27/02