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.locationanziché 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.locationstato 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.locationa window.location, ma preferisco ancora window.locationcome è quello che ho usato da quando ho scritto il mio primo DHTML.
window.location, non è ugualmente valido usare solo location?
windowoggetto. 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 locationviene 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.locationdi sola lettura in IE. Posso assegnarlo con successo in IE 10, 9, 8 e 6 (usando VM da modern.ie ).
console.log(location);? !!
document.locationera 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.locationinvece.
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.locatione document.locationnon può essere ombreggiato in Chrome o Firefox.
Per quanto ne so, entrambi sono uguali. Per la sicurezza tra browser è possibile utilizzare window.locationanziché document.location.
Tutti i browser moderni eseguono il mapping document.locationa window.location, ma preferisco ancora window.locationpoiché è quello che ho usato da quando ho scritto la mia prima pagina web. è più coerente.
puoi anche vedere i document.location === window.locationritorni 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 truementre "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 truese xey si riferiscono allo stesso oggetto. Altrimenti, ritorna false.
document.locatione puntino window.locationsu 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.locationrestituirà true mentre document.location===window.locationrestituirà false.
document.location === window.locationconfronto. Il fatto che anche il .constructorconfronto 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.locatione document.urlche è 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.locationsono stato in grado di ottenere i parametri hash dall'URL.
Quindi è sempre meglio usare window.location.
document.URL: era su window.locatione document.location. Inoltre, document.urlnon esiste = dovrebbe essere maiuscolo.
document.location.constructor === window.location.constructorlo è 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.locationquando hanno bisogno del protocollo in JS, credo che abbiano alcuni motivi per questo.
IN GENERALE : lo credo personalmente document.locatione window.locationsono 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