Os dois devem fazer referência ao mesmo objeto?
Os dois devem fazer referência ao mesmo objeto?
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 de document.location
.
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 por document.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
para window.location
, mas eu ainda prefiro window.location
como é o que eu usei desde que eu escrevi meu primeiro DHTML.
window.location
, não é igualmente válido usar apenas location
?
window
objeto. Portanto, qualquer variável ou função definida no nível superior do seu script é uma propriedade do objeto referenciado por window
, que passa a ser o objeto global. Objeto global é implícito quando ausente como window.
- assim location
é interpretado como sendo window.location
. Advertências - fe if(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).
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 seu window.location
lugar.
Consulte Mais informação:
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.
<img name='location' src='location.png'>
if (document.location.tagName == 'IMG') alert('Hello!')
window.location
e document.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 de document.location
.
Todos os navegadores modernos mapear document.location
para window.location
, mas eu ainda prefiro window.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
retornos true
, o que esclarece que ambos são iguais.
document.location === window.location
retorna true
Além disso
document.location.constructor === window.location.constructor
é true
Nota: Apenas testado no Firefox 3.6, Opera 10 e IE6
===
e ==
são equivalentes.
"abc" == new String("abc")
retorna true
enquanto "abc" === new String("abc")
retorna false
.
==
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 Return true
se x e y se referem ao mesmo objeto. Caso contrário, retorne false
.
document.location
e window.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 a window.location.toString()
, Then document.location==window.location
retornará true enquanto document.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:
window.location === document.location
É 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.
Eu diria que window.location
é a maneira mais confiável de obter o URL atual . A seguir é a diferença entre o window.location
e document.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 usei window.location
, consegui obter os parâmetros de hash do URL.
Portanto, é sempre melhor usar window.location
.
document.URL
- era sobre window.location
e document.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.
Bem, sim, eles são iguais, mas ....!
window.location
não está funcionando em alguns navegadores do Internet Explorer.
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):
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
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:
'//www.google-analytics.com/analytics.js'
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
e window.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.
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