Javascript: impostazione di location.href rispetto a location


311

Quando imposteresti locationuna stringa URL rispetto all'impostazione location.href?

location = "http://www.stackoverflow.com";

vs

location.href = "http://www.stackoverflow.com";

Riferimento per la rete di sviluppatori Mozilla


6
impostazione della location.hrefposta non riuscita a causa della stessa politica di origine: javascript.info/tutorial/…
Taha Jahangir,


1
Ho un'app Angular 4 che utilizza TypeScript 2.6.2. window.location è di sola lettura e posso assegnarlo solo usando window.location.href (nel contesto di un callback da una sottoscrizione angolare), senza errori di compilatore in fase di revisione - forse è una specie di compatibilità con JavaScript 1.0 o correlata alla gestione asincrona . Fondamentalmente window.location.href sembra essere l'unica cosa che funziona sempre.
Chris Halcrow,

Risposte:


261

È possibile impostare locationdirettamente perché è leggermente più breve. Se stai cercando di essere conciso, di solito puoi anche ometterlo window..

Le assegnazioni di URL a entrambi location.hrefe locationsono definite per funzionare in JavaScript 1.0, di nuovo in Netscape 2, e da allora sono state implementate in tutti i browser. Quindi fai la tua scelta e usa quello che ritieni più chiaro.


9
Come menzionato da @SwissMister nella risposta di seguito, sembra che window.location.href sia in qualche modo trattato come una richiesta XHR. Se attivato da un callback di successo di un XHR, window.location.href verrà trattato come un XHR mentre window.location emula il clic su un collegamento.
Akshay Raje,

147

Anche se entrambi funzionassero, userei quest'ultimo. locationè un oggetto e l'assegnazione di una stringa a un oggetto non è di buon auspicio per la leggibilità o la manutenzione.


60
Durante l'implementazione di una complessa integrazione PayPal, ho riscontrato un motivo molto convincente da utilizzare window.location: non è necessarioSAME ORIGIN .
Swiss Mister

4
Forse sono solo io ma location = 'http://www.example.com'sembra super leggibile. Anche se, come un caso speciale. Questo è retrocompatibile e rimarrà compatibile nel prossimo futuro.
Alex W

10
Se window.location fosse un oggetto, assegnare una stringa ad esso lo sovrascriverebbe con una stringa. In effetti window.location è una proprietà che ha metodi getter e setter. Quando lo si imposta, è prevista una stringa e l'oggetto Posizione globale viene aggiornato dal setter. Quando lo ottieni, viene restituito l'oggetto Location globale.
JukkaP,

64

Come già detto, locationè un oggetto . Ma quella persona ha suggerito di usare entrambi. Ma farai meglio ad usare la .hrefversione.

Gli oggetti hanno proprietà predefinite che, se non viene specificato nient'altro, vengono assunti. Nel caso locationdell'oggetto, ha una proprietà chiamata .href. E non specificando QUALSIASI proprietà durante l'assegnazione, assumerà "href" per impostazione predefinita.

Tutto questo va bene fino a quando non viene modificata una versione successiva del modello a oggetti e non esiste più una proprietà predefinita o la proprietà predefinita viene modificata. Quindi il tuo programma si interrompe inaspettatamente.

Se vuoi dire href, dovresti specificare href.


13
Buona spiegazione, meglio di semplici commenti generali sulla leggibilità o sulla manutenzione. In realtà, in questo caso particolare, il modello a oggetti non verrà modificato, poiché metà del web si fermerebbe - quindi usa uno dei due ... non importa quale
Neromancer

71
Sembra buono ma non è proprio vero. Non esiste un concetto di proprietà predefinita nel DOM o JavaScript in generale. L'assegnazione di una stringa locationfunziona perché la proprietà è stata definita per avere questo comportamento di assegnazione speciale in JavaScript 1.0 e da allora tutti i browser lo hanno implementato. HTML5 ora lo richiede. Pertanto, sebbene possa essere più bello o più coerente assegnarlo .href, non vi è alcun vantaggio di compatibilità con le versioni precedenti o successive.
Bobince,

6
la bellezza conta.
Tom Andersen,

4
window.location = urlè più bello
Eric Muyser il

21
location = urlè più carino
fregante il

20

Un paio di anni fa, locationnon ha funzionato per me in IE e location.hrefha funzionato (ed entrambi hanno funzionato in altri browser). Da allora ho sempre usato location.hrefe non ho più avuto problemi. Non ricordo quale versione di IE fosse.


42
Probabilmente era quella versione di IE in cui faceva cose sbagliate e ogni altro browser lo faceva correttamente. ;-)
Shawn D.

9
in strict modeChrome genererà un'eccezione se si tenta di assegnare direttamente locationanche a, quindi uso semprelocation.href
Hashbrown,

9
"una" versione di IE?
Lpc_dark,

@Shawn D. Un browser sta facendo le cose correttamente? Quando è successo! : D
user2173353

15

Giusto per chiarire, non si può fare location.split('#'), locationè un oggetto, non una stringa. Ma puoi farlo location.href.split('#');perché location.hrefè una stringa.


3
Il tuo commento è vero, ma stai parlando di ottenere l'attributo href, una stringa, dell'oggetto location. Tutte le altre discussioni riguardano l' assegnazione di un valore, non la lettura del valore. Ma il tuo punto è corretto. La differenza è che href è una stringa mentre location è un oggetto.
Phil DD,

15

Una differenza da tenere a mente, però.

Supponiamo che tu voglia creare un URL utilizzando l'URL corrente. Il seguente codice infatti ti reindirizzerà, perché non sta chiamando String.replacema Location.replace:

nextUrl = window.location.replace('/step1', '/step2');

I seguenti codici funzionano:

// cast to string
nextUrl = (window.location+'').replace('/step1', '/step2');

// href property
nextUrl = window.location.href.replace('/step1', '/step2');

3

Con TypeScript utilizzare window.location.hrefcome window.locationè tecnicamente un oggetto contenente:

Properties
hash 
host 
hostname
href    <--- you need this
pathname (relative to the host)
port 
protocol 
search 

L'impostazione window.locationprodurrà un errore di tipo, mentre window.location.hrefè di tipo stringa.

fonte

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.