Os dois devem fazer referência ao mesmo objeto?
javascript
window.location
Morgan Cheng
fonte
fonte
Respostas:
De acordo com o W3C, eles são os mesmos. Na realidade, para segurança entre navegadores, você deve usar em
window.location
vez dedocument.location
.Veja: http://www.w3.org/TR/html/browsers.html#dom-location
fonte
window.location
) sem fornecer qualquer justificativa para isso. Se você não fornecer a justificativa, por que alguém deve seguir seu conselho? A resposta de Christoph é muito mais útil nesse sentido.A maneira canônica de obter o objeto de localização atual é
window.location
(consulte esta página do MSDN de 1996 e o rascunho do W3C de 2006 ).Compare isso com
document.location
, que originalmente retornava apenas o URL atual como uma string (consulte esta página no MSDN ). Provavelmente, para evitar confusão,document.location
foi substituído pordocument.URL
(consulte aqui no MSDN ), que também faz parte do DOM Nível 1 .Tanto quanto eu sei, todos os navegadores modernos mapear
document.location
parawindow.location
, mas eu ainda prefirowindow.location
como é o que eu usei desde que eu escrevi meu primeiro DHTML.fonte
window.location
, não é igualmente válido usar apenaslocation
?window
objeto. Portanto, qualquer variável ou função definida no nível superior do seu script é uma propriedade do objeto referenciado porwindow
, que passa a ser o objeto global. Objeto global é implícito quando ausente comowindow.
- assimlocation
é interpretado como sendowindow.location
. Advertências - feif(an_undefined_variable)
lançará um erro se a variável não tiver sido definida -if(window.an_undefined_variable)
não será.window.location é leitura / gravação em todos os navegadores compatíveis.
O document.location é somente leitura no Internet Explorer (pelo menos), mas lê / grava em navegadores baseados no Gecko (Firefox, SeaMonkey).
fonte
document.location
é somente leitura no IE. Posso atribuir a ele com êxito no IE 10, 9, 8 e 6 (usando VMs da modern.ie ).console.log(location);
? !!document.location
era originalmente uma propriedade somente leitura, embora os navegadores Gecko permitam que você o atribua também. Para segurança entre navegadores, use em seuwindow.location
lugar.Consulte Mais informação:
document.location
window.location
fonte
Curiosamente, se você tiver um quadro, imagem ou formulário chamado 'local', 'document.location' fornecerá uma referência à janela, imagem ou formulário do quadro, respectivamente, em vez do objeto Local. Aparentemente, isso ocorre porque a pesquisa de nome da coleção document.forms, document.images e window.frames obtém prioridade sobre o mapeamento para window.location.
fonte
window.location
edocument.location
não pode ser sombreada no Chrome ou Firefox.Tanto quanto eu sei, ambos são iguais. Para segurança entre navegadores, você pode usar em
window.location
vez dedocument.location
.Todos os navegadores modernos mapear
document.location
parawindow.location
, mas eu ainda prefirowindow.location
como é o que eu usei desde que eu escrevi minha primeira página web. é mais consistente.você também pode ver
document.location === window.location
retornostrue
, o que esclarece que ambos são iguais.fonte
document.location === window.location
retornatrue
Além disso
document.location.constructor === window.location.constructor
étrue
Nota: Apenas testado no Firefox 3.6, Opera 10 e IE6
fonte
===
e==
são equivalentes."abc" == new String("abc")
retornatrue
enquanto"abc" === new String("abc")
retornafalse
.==
e===
são equivalentes. Veja as seções de especificação 11.9.3 e 11.9.6. Para valores não nulos, não indefinidos, sem número, sem bool e sem seqüência de caracteres com o mesmo tipo, o==
comportamento é governado pela 11.9.3 parte 1f e o===
comportamento pela 11.9.6 parte 7, que lêem idêntico Returntrue
se x e y se referem ao mesmo objeto. Caso contrário, retornefalse
.document.location
ewindow.location
estão a apontar para objetos. Você está perdendo o ponto inteiro dos triplos iguais; usar 2 iguais não prova que eles são o mesmo objetivo. Devemos usar 3 iguais e não 2 iguais, porque 2 iguais nos darão um falso positivo. Em um navegador no qual document.location é uma string de URL igual awindow.location.toString()
, Thendocument.location==window.location
retornará true enquantodocument.location===window.location
retornará false.document.location === window.location
comparação. O fato de a.constructor
comparação ser feita também significa, penso eu, que essa resposta ainda é sólida, mas o uso===
simplificaria o raciocínio.Sim, eles são iguais. É uma das muitas peculiaridades históricas na API JS do navegador. Tente fazer:
fonte
window.location é o mais confiável dos dois, considerando navegadores mais antigos.
fonte
É raro ver a diferença hoje em dia porque o html 5 não suporta mais conjuntos de quadros. Mas no momento em que temos o conjunto de quadros, document.location redirecionaria apenas o quadro no qual o código está sendo executado, e window.location redirecionava a página inteira.
fonte
Eu diria que
window.location
é a maneira mais confiável de obter o URL atual . A seguir é a diferença entre owindow.location
edocument.url
que veio em frente em um dos cenários onde eu estava anexando parâmetros de hash no URL e lê-lo mais tarde.Depois de adicionar parâmetros de hash no URL.
Em um navegador mais antigo, não consegui obter os parâmetros de hash do URL usando
document.url
, mas quando o useiwindow.location
, consegui obter os parâmetros de hash do URL.Portanto, é sempre melhor usar
window.location
.fonte
document.URL
- era sobrewindow.location
edocument.location
. Além disso,document.url
não existe = deve estar em maiúsculas.document.location.constructor === window.location.constructor
étrue
.É porque é exatamente o mesmo objeto que você pode ver
document.location===window.location
.Portanto, não há necessidade de comparar o construtor ou qualquer outra propriedade.
fonte
Pelo menos no IE, há uma pequena diferença no arquivo local:
document.URL retornará "file: // C: \ projects \ abc \ a.html"
mas window.location.href retornará "file: /// C: /projects/abc/a.html"
Um é barra invertida, um é barra invertida.
fonte
Bem, sim, eles são iguais, mas ....!
window.location
não está funcionando em alguns navegadores do Internet Explorer.fonte
Apesar da maioria das pessoas recomendar aqui, é assim que o protocolo dinâmico do Google Analytics fica há anos (antes de passarem de ga.js para analytics.js recentemente):
Mais informações: https://developers.google.com/analytics/devguides/collection/gajs/
Na nova versão, eles usaram '//' para que o navegador possa adicionar automaticamente o protocolo:
Portanto, se o Google preferir document.location para
window.location
quando eles precisarem de protocolo em JS, acho que eles têm alguns motivos para isso.GERAL : Pessoalmente, acredito nisso
document.location
ewindow.location
são os mesmos, mas se for gigante com maiores estatísticas sobre o uso de navegadores como o Google usando document.location , recomendo segui-los.fonte
Na verdade, percebo uma diferença no cromo entre os dois. Por exemplo, se você quiser fazer uma navegação para um quadro em área restrita a partir de um quadro filho, poderá fazer isso apenas com document.location, mas não com window.location
fonte