Entrambi dovrebbero fare riferimento allo stesso oggetto?
Entrambi dovrebbero fare riferimento allo stesso oggetto?
Risposte:
Secondo il W3C, sono gli stessi. In realtà, per la sicurezza cross-browser, è necessario utilizzare window.location
anziché document.location
.
window.location
) senza fornire alcuna giustificazione per essa. Se non fornisci la giustificazione, perché qualcuno dovrebbe ricevere il tuo consiglio? La risposta di Christoph è molto più utile in questo senso.
Il modo canonico per ottenere l'oggetto della posizione corrente è window.location
(vedere questa pagina MSDN del 1996 e la bozza del W3C del 2006 ).
Confronta questo con document.location
, che originariamente restituiva solo l'URL corrente come stringa (vedi questa pagina su MSDN ). Probabilmente per evitare confusione, è document.location
stato sostituito con document.URL
(vedi qui su MSDN ), che fa anche parte del livello DOM 1 .
Per quanto ne so, tutti i browser moderni si associano document.location
a window.location
, ma preferisco ancora window.location
come è quello che ho usato da quando ho scritto il mio primo DHTML.
window.location
, non è ugualmente valido usare solo location
?
window
oggetto. Pertanto, qualsiasi variabile o funzione definita al livello più alto dello script è una proprietà dell'oggetto a cui fa riferimento window
, che risulta essere l'oggetto globale. L'oggetto globale è implicito quando assente come window.
- quindi location
viene interpretato come window.location
. Avvertenze - fe if(an_undefined_variable)
genererà un errore se la variabile non è stata definita - if(window.an_undefined_variable)
non lo farà.
window.location viene letto / scritto su tutti i browser compatibili.
document.location è di sola lettura in Internet Explorer (almeno), ma in lettura / scrittura nei browser basati su Gecko (Firefox, SeaMonkey).
document.location
di sola lettura in IE. Posso assegnarlo con successo in IE 10, 9, 8 e 6 (usando VM da modern.ie ).
console.log(location);
? !!
document.location
era in origine una proprietà di sola lettura, anche se i browser Gecko ti consentono di assegnare anche ad essa. Per la sicurezza tra browser, utilizzare window.location
invece.
Leggi di più:
È interessante notare che se hai una cornice, un'immagine o un modulo chiamato 'location', allora 'document.location' fornisce un riferimento rispettivamente alla finestra, all'immagine o al frame della cornice, anziché all'oggetto Location. Apparentemente, questo perché la ricerca del nome della raccolta document.forms, document.images e window.frames ha la priorità sulla mappatura su window.location.
<img name='location' src='location.png'>
if (document.location.tagName == 'IMG') alert('Hello!')
window.location
e document.location
non può essere ombreggiato in Chrome o Firefox.
Per quanto ne so, entrambi sono uguali. Per la sicurezza tra browser è possibile utilizzare window.location
anziché document.location
.
Tutti i browser moderni eseguono il mapping document.location
a window.location
, ma preferisco ancora window.location
poiché è quello che ho usato da quando ho scritto la mia prima pagina web. è più coerente.
puoi anche vedere i document.location === window.location
ritorni true
, il che chiarisce che entrambi sono uguali.
document.location === window.location
ritorna true
anche
document.location.constructor === window.location.constructor
è true
Nota: appena testato su Firefox 3.6, Opera 10 e IE6
===
e ==
sono equivalenti.
"abc" == new String("abc")
ritorna true
mentre "abc" === new String("abc")
ritorna false
.
==
e ===
sono equivalenti. Vedi le sezioni 11.9.3 e 11.9.6. Per valori non nulli, non indefiniti, non numerici, non boolici, non stringa con lo stesso tipo, il ==
comportamento è regolato da 11.9.3 parte 1f e il ===
comportamento da 11.9.6 parte 7, che in modo identico legge Restituisce true
se xey si riferiscono allo stesso oggetto. Altrimenti, ritorna false
.
document.location
e puntino window.location
su oggetti. Ti manca l'intero punto del triplo uguale; l'utilizzo di 2 equals non dimostra che siano lo stesso oggetto. Dovremmo usare 3 uguali e non 2 uguali perché 2 uguali ci daranno un falso positivo. Su un browser in cui document.location è una stringa URL uguale a window.location.toString()
, Quindi document.location==window.location
restituirà true mentre document.location===window.location
restituirà false.
document.location === window.location
confronto. Il fatto che anche il .constructor
confronto venga lanciato significa, penso, che questa risposta è ancora valida, ma l'uso ===
semplificherebbe il ragionamento.
Sì, sono uguali. È una delle tante stranezze storiche nell'API JS del browser. Prova a fare:
window.location === document.location
Al giorno d'oggi è raro vedere la differenza perché html 5 non supporta più i set di frame. Ma ai tempi abbiamo frameset, document.location reindirizzerebbe solo il frame in cui viene eseguito il codice e window.location reindirizzerebbe l'intera pagina.
Direi che window.location
è il modo più affidabile per ottenere l' URL corrente . Di seguito è la differenza tra il window.location
e document.url
che è venuto in primo piano in uno degli scenari in cui stavo aggiungendo i parametri hash nell'URL e leggendolo in seguito.
Dopo aver aggiunto i parametri hash nell'URL.
In un browser più vecchio, non ero in grado di ottenere i parametri hash dall'URL usando document.url
, ma quando l'ho usato window.location
sono stato in grado di ottenere i parametri hash dall'URL.
Quindi è sempre meglio usare window.location
.
document.URL
: era su window.location
e document.location
. Inoltre, document.url
non esiste = dovrebbe essere maiuscolo.
document.location.constructor === window.location.constructor
lo è true
.
È perché è esattamente lo stesso oggetto da cui puoi vedere document.location===window.location
.
Quindi non è necessario confrontare il costruttore o qualsiasi altra proprietà.
Bene sì, sono uguali, ma ....!
window.location
non funziona su alcuni browser Internet Explorer.
Nonostante la maggior parte delle persone raccomandino qui, è così che il protocollo dinamico di Google Analytics è apparso per anni (prima di passare da ga.js a analytics.js di recente):
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
Ulteriori informazioni: https://developers.google.com/analytics/devguides/collection/gajs/
Nella nuova versione hanno usato '//' in modo che il browser possa aggiungere automaticamente il protocollo:
'//www.google-analytics.com/analytics.js'
Quindi, se Google preferisce document.location a window.location
quando hanno bisogno del protocollo in JS, credo che abbiano alcuni motivi per questo.
IN GENERALE : lo credo personalmente document.location
e window.location
sono gli stessi, ma se gigante con le maggiori statistiche sull'uso di browser come Google che utilizza document.location , consiglio di seguirli.
In realtà noto una differenza in chrome tra i due, ad esempio se vuoi fare una navigazione verso un frame sandbox da un frame figlio, puoi farlo solo con document.location ma non con window.location