Qual è la differenza tra window.location = e window.location.replace ()?


Risposte:


408

window.location aggiunge un elemento alla cronologia in quanto puoi (o dovresti essere in grado di) fare clic su "Indietro" e tornare alla pagina corrente.

window.location.replace sostituisce l'elemento storico corrente in modo da non poterlo tornare indietro.

Vedi window.location:

assign(url): Carica il documento nell'URL fornito.

replace(url): Sostituisci il documento corrente con quello nell'URL fornito. La differenza rispetto al assign()metodo è che dopo aver utilizzato replace()la pagina corrente non verrà salvata nella cronologia delle sessioni, il che significa che l'utente non sarà in grado di utilizzare il pulsante Indietro per spostarsi su di essa.

Oh e in generale:

window.location.href = url;

è preferito rispetto a:

window.location = url;

52
Perché sarebbe window.location.hrefpreferito window.location?
Mathias Bynens l'


1
Domanda: se utilizzo un window.location.replace(URL)URL esattamente uguale a quello corrente, posso aspettarmi che si aggiorni / ricarichi o abbia l'opzione di non fare nulla?
user9645,

11

TLDR;

usare location.hrefo usare meglio window.location.href;

Tuttavia se leggi questo otterrai prove innegabili.

La verità è che va bene usare, ma perché fare cose discutibili. Dovresti prendere la strada più alta e farlo nel modo in cui probabilmente dovrebbe essere fatto.

location = "#/mypath/otherside"
var sections = location.split('/')

Questo codice è perfettamente corretto in termini di sintassi, in termini logici, in termini di tipo, conosci l'unica cosa che non va?

ha locationinvece dilocation.href

che dire di questo

var mystring = location = "#/some/spa/route"

qual è il valore di mystring? qualcuno lo sa davvero senza fare qualche test. Nessuno sa cosa accadrà esattamente qui. Diavolo l'ho appena scritto e non so nemmeno cosa faccia. locationè un oggetto ma sto assegnando una stringa, passerà la stringa o passerà l'oggetto posizione. Diciamo che c'è una risposta a come dovrebbe essere implementato. Potete garantire che tutti i browser facciano la stessa cosa?

Questo posso praticamente supporre che tutti i browser gestiranno lo stesso.

var mystring = location.href = "#/some/spa/route"

E se lo inserissi in dattiloscritto si romperà perché il compilatore del tipo dirà che si suppone che sia un oggetto?

Questa conversazione è molto più profonda del semplice locationoggetto comunque. Che cos'è questa conversione su che tipo di programmatore vuoi essere?

Se prendi questa scorciatoia, sì, potrebbe andare bene oggi, potresti andare bene domani, l'inferno potrebbe andare bene per sempre, ma ora sei un cattivo programmatore. Non ti andrà bene e ti mancherà.

Ci saranno più oggetti. Ci sarà una nuova sintassi.

Potresti definire un getter che prende solo una stringa ma restituisce un oggetto e la parte peggiore è che penserai di fare qualcosa di corretto, potresti pensare di essere brillante per questo metodo intelligente perché le persone qui ti hanno fatto vergognare.

var Person.name = {first:"John":last:"Doe"}
console.log(Person.name) // "John Doe"

Con getter e setter questo codice funzionerebbe davvero, ma solo perché può essere fatto non significa che sia "SAGGIO" farlo.

Molte persone che programmano adorano programmare e amano migliorare. Negli ultimi anni sono diventato abbastanza bravo e ho imparato molto. La cosa più importante che conosco ora, specialmente quando scrivi Librerie, è coerenza e prevedibilità.

Fai le cose che puoi costantemente fare.

+"2"<- questo qui analizza la stringa in un numero. dovresti usarlo? o dovresti usare parseInt("2")?

che dire var num =+"2"?

Da quello che hai imparato, dalle menti di StackOverflow non sono troppo speranzoso.

Se inizi a seguire queste 2 parole coerenti e prevedibili. Conoscerai la risposta giusta a tantissime domande su StackOverflow.

Lascia che ti mostri come questo ripaga. Normalmente posiziono ;su ogni riga di javascript che scrivo. So che è più espressivo. So che è più chiaro. Ho seguito le mie regole. Un giorno ho deciso di non farlo. Perché? Perché così tante persone mi dicono che non è più necessario e JavaScript può farne a meno. Quindi quello che ho deciso di fare questo. Ora, poiché sono diventato sicuro di me stesso come programmatore (come dovresti goderti il ​​frutto della padronanza di una lingua) ho scritto qualcosa di molto semplice e non l'ho verificato. Ho cancellato una virgola e non pensavo di dover ripetere il test per una cosa così semplice come rimuovere una virgola.

Ho scritto qualcosa di simile a questo in es6 e babel

var a = "hello world"
(async function(){
  //do work
})()

Questo codice ha esito negativo e ha impiegato un'eternità per capire. Per qualche ragione quello che vide fu

var a = "hello world"(async function(){})()

nascosto nel profondo del codice sorgente mi diceva che "ciao mondo" non è una funzione.

Per nodo più divertente non mostra le mappe di origine del codice traspilato.

Ho perso così tanto tempo stupido. Stavo anche presentando a qualcuno come ES6 è geniale e poi ho dovuto iniziare il debug e dimostrare quanto ES6 sia privo di mal di testa e migliore. Non è convincente.

Spero che questo abbia risposto alla tua domanda. Questa è una vecchia domanda, è più per le generazioni future, le persone che stanno ancora imparando.

Domanda quando le persone dicono che non importa in entrambi i modi. È probabile che una persona più saggia e più esperta ti dirà altri saggi.

cosa succede se qualcuno sovrascrive l'oggetto posizione. Faranno uno shim per i browser più vecchi. Otterrà alcune nuove funzionalità che devono essere eliminate e il tuo codice di 3 anni fallirà.

La mia ultima nota su cui riflettere.

Scrivere codice chiaro e chiaro fa qualcosa per il tuo codice a cui non si può rispondere con giusto o sbagliato. Quello che fa è rendere il tuo codice un attivatore.

Puoi usare più plugin di cose, Librerie senza timore di interruzioni tra i codici.

per il record. uso

window.location.href


24
Risposta informativa lunga, sostenuta con passione. Ma litigando per l'uso di window.location.hrefover window.location, hai dimenticato che la domanda era in realtà la differenza tra questi ewindow.location.replace()
AntonChanning

10
Ogni volta che vedo TLDR mi aspetto una risposta più CORTA, non più lunga di 5 volte.
user9645,

3
TLDR; use location.href or better use window.location.href; Il TLDR è questa linea. Il resto è la "risposta".
Elysiumplain,

Non credo che tu valga un punto valido introducendo un caso d'uso non comune. vale a dire mystring = location.href = "#/some/spa/route". Inoltre, molte lingue consentirebbero il cast di tipi (impliciti) in qualche modo. Alla fine, javascript è un linguaggio tipizzato dinamico, inserisci concetti di tipo e afferma che non va bene non ha senso.
apple apple

1
cosa succede se qualcuno sovrascrive l'oggetto posizione . bene, proprio come dire cosa succede se qualcuno sovrascrive consoleo ombreggia window- Ora hai un problema più grande .
apple apple
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.