Javascript: Location.href versus Location einstellen


311

Wann würden Sie locationeine URL-Zeichenfolge im Vergleich zur Einstellung festlegen location.href?

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

vs.

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

Mozilla Developer-Netzwerkreferenz


6
Das Festlegen der location.hrefE-Mail schlägt aufgrund der Richtlinie für denselben Ursprung fehl: javascript.info/tutorial/…
Taha Jahangir,


1
Ich habe eine Angular 4-App, die TypeScript 2.6.2 verwendet. window.location ist schreibgeschützt und ich kann nur mit window.location.href (im Kontext eines Rückrufs von einem Winkelabonnement) zuweisen, ohne dass Compilerfehler behoben werden - möglicherweise ist dies eine Art JavaScript 1.0-Kompatibilitätssache oder hängt mit der asynchronen Behandlung zusammen . Grundsätzlich scheint window.location.href das einzige zu sein, was immer funktioniert.
Chris Halcrow

Antworten:


261

Sie können locationdirekt einstellen, weil es etwas kürzer ist. Wenn Sie versuchen, knapp zu sein, können Sie dies normalerweise auch weglassen window..

URL-Zuweisungen für beide location.hrefund locationsind so definiert, dass sie in JavaScript 1.0, zurück in Netscape 2, funktionieren. Seitdem wurden sie in jedem Browser implementiert. Treffen Sie also Ihre Wahl und verwenden Sie das, was Sie am klarsten finden.


9
Wie von @SwissMister in der Antwort unten erwähnt, scheint window.location.href wie eine XHR-Anfrage behandelt zu werden. Wenn window.location.href aus dem erfolgreichen Rückruf eines XHR heraus ausgelöst wird, wird es als XHR behandelt, während window.location das Klicken auf einen Link emuliert.
Akshay Raje

147

Selbst wenn beide funktionieren, würde ich letzteres verwenden. locationist ein Objekt, und das Zuweisen einer Zeichenfolge zu einem Objekt ist kein gutes Zeichen für die Lesbarkeit oder Wartung.


60
Bei der Implementierung einer komplexen PayPal-Integration bin ich auf einen sehr zwingenden Grund für die Verwendung gestoßen window.location: Dies ist nicht erforderlichSAME ORIGIN .
Schweizer Herr

4
Vielleicht bin ich es nur, aber es location = 'http://www.example.com'scheint super lesbar. Allerdings als Sonderfall. Das ist abwärtskompatibel und wird auf absehbare Zeit kompatibel bleiben .
Alex W

10
Wenn window.location ein Objekt wäre, würde das Zuweisen einer Zeichenfolge es mit einer Zeichenfolge überschreiben. Tatsächlich ist window.location eine Eigenschaft mit Getter- und Setter-Methoden. Wenn Sie es festlegen, wird eine Zeichenfolge erwartet und das globale Standortobjekt wird vom Setter aktualisiert. Wenn Sie es erhalten, wird das globale Standortobjekt zurückgegeben.
JukkaP

64

Wie schon gesagt, locationist ein Objekt . Aber diese Person schlug vor, entweder zu verwenden. Sie sollten die .hrefVersion jedoch besser verwenden .

Objekte haben Standardeigenschaften, die angenommen werden, wenn nichts anderes angegeben ist. Im Fall des locationObjekts hat es eine Eigenschaft namens .href. Wenn Sie während der Zuweisung keine Eigenschaft angeben, wird standardmäßig "href" angenommen.

Dies ist alles in Ordnung, bis sich eine spätere Objektmodellversion ändert und entweder keine Standardeigenschaft mehr vorhanden ist oder die Standardeigenschaft geändert wird. Dann bricht Ihr Programm unerwartet ab.

Wenn Sie meinen href, sollten Sie angeben href.


13
Gute Erklärung, besser als nur allgemeine Kommentare zur Lesbarkeit oder Wartung. In der Realität wird in diesem speziellen Fall das Objektmodell nicht geändert, da die Hälfte des Webs anhalten würde - verwenden Sie daher entweder ... es spielt keine Rolle, welcher
Neromancer

71
Das hört sich gut an, ist aber nicht wirklich wahr. Es gibt kein Konzept für eine Standardeigenschaft im DOM oder in JavaScript im Allgemeinen. Das Zuweisen einer Zeichenfolge zu locationfunktioniert, da die Eigenschaft so definiert wurde, dass sie dieses spezielle Zuweisungsverhalten in JavaScript 1.0 aufweist, und seitdem hat jeder Browser dies implementiert. HTML5 benötigt es jetzt. Die Zuweisung .hrefist zwar hübscher oder konsistenter , bietet jedoch keinen Vorteil hinsichtlich der Abwärts- oder Vorwärtskompatibilität.
Bobince

6
Hübschheit zählt.
Tom Andersen

4
window.location = urlist schöner
Eric Muyser

21
location = urlist niedlicher
fregante

20

Vor ein paar Jahren locationfunktionierte nicht für mich im IE und location.hreftat es (und beide arbeiteten in anderen Browsern). Seitdem habe ich immer nur benutzt location.hrefund hatte nie wieder Probleme. Ich kann mich nicht erinnern, welche Version von IE das war.


42
Es war wahrscheinlich diese eine Version von IE, in der es etwas falsch gemacht hat und jeder andere Browser es richtig gemacht hat. ;-)
Shawn D.

9
in strict modeChrome wird eine Ausnahme locationlocation.href
auslösen,

9
"eine" Version von IE?
Lpc_dark

@Shawn D. Ein Browser, der die Dinge richtig macht? Wann ist das passiert! : D
user2173353

15

Nur um zu verdeutlichen, können Sie nicht tun location.split('#'), locationist ein Objekt, keine Zeichenfolge. Aber Sie können tun, location.href.split('#');weil location.hrefist eine Zeichenfolge.


3
Ihr Kommentar ist wahr, aber Sie sprechen immer das Attribut href, eine Zeichenfolge, des Standortobjekts. In allen anderen Diskussionen geht es darum , einen Wert zuzuweisen und nicht den Wert zu lesen. Aber dein Punkt ist richtig. Der Unterschied besteht darin, dass href eine Zeichenfolge ist, während location ein Objekt ist.
Phil DD

15

Ein Unterschied, den Sie jedoch beachten sollten.

Angenommen, Sie möchten eine URL mit der aktuellen URL erstellen. Der folgende Code leitet Sie tatsächlich weiter, da er nicht aufruft, String.replacesondern Location.replace:

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

Die folgenden Codes funktionieren:

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

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

3

Mit Typoskript Verwendung window.location.hrefals window.locationtechnisch ein Objekt enthält:

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

Die Einstellung window.locationführt zu einem Typfehler, während window.location.hrefes sich um eine Typzeichenfolge handelt.

Quelle

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.