Qual è la differenza tra window.location e document.location in JavaScript?


Risposte:


220

Secondo il W3C, sono gli stessi. In realtà, per la sicurezza cross-browser, è necessario utilizzare window.locationanziché document.location.

Vedi: http://www.w3.org/TR/html/browsers.html#dom-location


12
Downvoted. Risposta contraddittoria. Dice audacemente che sono uguali, quindi descrive le differenze nel testo più chiaro. Non sono decisamente gli stessi.
Danorton,

33
Dai, abbattitori felici e scatenati, alleggerisci un po '. Per la maggior parte, si comportano allo stesso modo CONSIDERANDO LA CAVEAT SPECIFICATA da rahul. Non inchiodiamolo sulla semantica. Un po 'di Philadelphia, signori. Io, per esempio, ho trovato la sua risposta pienamente soddisfacente. +1 (Christoph's dovrebbe essere la risposta accettata, ma rahul è accettabile - almeno, non degno di un voto
negativo

7
-1 per raccomandare una buona pratica (sempre usando 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.
Mark Amery,

+1, ma vedi anche le risposte di Phil Hamer e Christoph di seguito, aggiungono informazioni di base essenziali e avvertenze per comprendere appieno il problema.
Jon z

In realtà noto una differenza tra entrambi, ad esempio se si desidera eseguire una navigazione verso un frame sandbox da un frame figlio, è possibile farlo solo con document.location ma non con window.location
M.Abulsoud

207

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.


1
se usi window.location, non è ugualmente valido usare solo location?
commonpike

2
@commonpike Lo è - nel contesto di uno script in [almeno] un documento HTML, l'oggetto globale in cui tutte le variabili definite diventano proprietà, è l' 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à.
AMN

92

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).


10
Non riesco a riprodurre l'affermazione document.locationdi sola lettura in IE. Posso assegnarlo con successo in IE 10, 9, 8 e 6 (usando VM da modern.ie ).
Mark Amery,

qualche commento su console.log(location);? !!
Fr0zenFir

44

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ù:

document.location

window.location


Non riesco a trovare una risposta chiara quando utilizzarne uno, dai un'occhiata alla mia risposta di seguito
M.Abulsoud,

37

È 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!')

2
Non c'è priorità, è semplicemente sovrascritto
Pacerier

7
No, non è sovrascritto. È oscurato, quindi Phil ha ragione sull'elemento che ha la precedenza durante la risoluzione delle proprietà.
Kangax,

@kangax, sembra che tu abbia ragione: jsfiddle.net/uL4ysszr . Ma quanto è affidabile questo comportamento? È sufficientemente cross-browser?
Pacerier,

1
Ho appena provato questo (ottobre 2016). Sembra che window.locatione document.locationnon può essere ombreggiato in Chrome o Firefox.
Mr. Llama,

1
@ Mr.Llama Hai ragione. Sembra che tutti i browser moderni non si comportino più nel modo che ho descritto sopra. Sembra essere dovuto al fatto di assegnare a document.location l'attributo "Imperdonabile". Rilevante modifica del cromo: src.chromium.org/viewvc/blink?view=revision&revision=189862 E bug di Firefox: bugzilla.mozilla.org/show_bug.cgi?id=1133760
Phil Hamer

27

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.


14

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


1
@Pacerier Why? Per gli oggetti ===e ==sono equivalenti.
Mark Amery,

4
@MarkAmery, è sbagliato e può essere facilmente dimostrato: "abc" == new String("abc")ritorna truementre "abc" === new String("abc")ritorna false.
Pacerier,

7
@Pacerier Va bene, lasciatemelo dire un po 'più rigorosamente e meno ambiguo: quando si confrontano due oggetti tra loro (piuttosto che solo un oggetto con qualsiasi cosa), ==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.
Mark Amery,

10
@MarkAmery, Non vi è alcuna garanzia che entrambi 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.
Pacerier,

@Pacerier Aha - Finalmente capisco. Hai ragione, almeno per quanto riguarda il 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.
Mark Amery,

11

Sì, sono uguali. È una delle tante stranezze storiche nell'API JS del browser. Prova a fare:

window.location === document.location

8

window.location è il più affidabile dei due, considerando i browser più vecchi.


3

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.


2

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.


1
-1. La domanda non ha nemmeno menzionato document.URL: era su window.locatione document.location. Inoltre, document.urlnon esiste = dovrebbe essere maiuscolo.
Mark Amery,

2

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à.


2

Almeno in IE, ha una piccola differenza sul file locale:

document.URL restituirà "file: // C: \ projects \ abc \ a.html"

ma window.location.href restituirà "file: /// C: /projects/abc/a.html"

Uno è barra rovesciata, uno è barra rovesciata.


2

Bene sì, sono uguali, ma ....!

window.location non funziona su alcuni browser Internet Explorer.


0

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.


2
Non ho votato a fondo, tuttavia, potrebbe essere perché questa è una domanda davvero vecchia e la tua risposta non fornisce alcuna prova nuova o preziosa che uno sia migliore dell'altro. Oppure potrebbe essere perché la tua risposta suggerisce il contrario dell'opinione pubblica, indipendentemente dal merito che dai a ciò che Google ha fatto storicamente. Oppure, potrebbe essere che al downvoter non piacesse il modo in cui hai enfatizzato parti della tua risposta che non hanno davvero bisogno di essere enfatizzate. Potrebbe essere qualsiasi cosa davvero. Questa è la bellezza del voto anonimo su SO.
M.Babcock,

0

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.