Sollten beide auf dasselbe Objekt verweisen?
Sollten beide auf dasselbe Objekt verweisen?
Antworten:
Laut W3C sind sie gleich. In Wirklichkeit sollten Sie aus Gründen der browserübergreifenden Sicherheit window.location
eher als verwenden document.location
.
window.location
) ohne Begründung. Wenn Sie die Begründung nicht liefern, warum sollte jemand Ihren Rat befolgen? Christophs Antwort ist in dieser Hinsicht weitaus nützlicher.
Der kanonische Weg, um das aktuelle Standortobjekt abzurufen, ist window.location
(siehe diese MSDN-Seite von 1996 und den W3C-Entwurf von 2006 ).
Vergleichen Sie dies mit document.location
, das ursprünglich nur die aktuelle URL als Zeichenfolge zurückgegeben hat (siehe diese Seite auf MSDN ). Wahrscheinlich, um Verwirrung zu vermeiden, document.location
wurde durch document.URL
(siehe hier auf MSDN ) ersetzt, das ebenfalls Teil von DOM Level 1 ist .
Soweit ich weiß, Karte alle modernen Browser document.location
zu window.location
, aber ich immer noch lieber window.location
als das ist , was ich verwendet habe , seit ich meinen ersten DHTML geschrieben.
window.location
, ist es nicht gleichermaßen gültig, nur zu verwenden location
?
window
Objekt. Daher ist jede Variable oder Funktion, die Sie auf der obersten Ebene Ihres Skripts definieren, eine Eigenschaft des Objekts, auf das verwiesen wird window
, das zufällig das globale Objekt ist. Globales Objekt wird impliziert, wenn es abwesend ist window.
- also location
als interpretiert window.location
. Vorsichtsmaßnahmen - zB if(an_undefined_variable)
wird ein Fehler ausgegeben , wenn die Variable nicht definiert wurde - if(window.an_undefined_variable)
nicht.
window.location wird in allen kompatiblen Browsern gelesen / geschrieben.
document.location ist (zumindest) in Internet Explorer schreibgeschützt, in Gecko-basierten Browsern (Firefox, SeaMonkey) jedoch schreibgeschützt.
document.location
die im IE schreibgeschützt ist, nicht reproduzieren . Ich kann es erfolgreich in IE 10, 9, 8 und 6 zuweisen (mit VMs von modern.ie ).
console.log(location);
? !!
document.location
war ursprünglich eine schreibgeschützte Eigenschaft, obwohl Sie sie auch in Gecko-Browsern zuweisen können. Verwenden Sie window.location
stattdessen für die browserübergreifende Sicherheit .
Weiterlesen:
Interessanterweise enthält 'document.location', wenn Sie einen Rahmen, ein Bild oder ein Formular mit dem Namen 'location' haben, anstelle des Location-Objekts einen Verweis auf das Rahmenfenster, das Bild bzw. das Formular. Dies liegt anscheinend daran, dass die Suche nach den Auflistungsnamen document.forms, document.images und window.frames Vorrang vor der Zuordnung zu window.location hat.
<img name='location' src='location.png'>
if (document.location.tagName == 'IMG') alert('Hello!')
window.location
und document.location
kann nicht in Chrome oder Firefox beschattet werden.
Soweit ich weiß, sind beide gleich. Für die browserübergreifende Sicherheit können Sie window.location
eher als verwenden document.location
.
Alle modernen Browser Karte document.location
zu window.location
, aber ich immer noch lieber window.location
als das ist , was ich verwendet habe , seit ich meine erste Web - Seite geschrieben. es ist konsequenter.
Sie können auch document.location === window.location
Rückgaben sehen true
, die verdeutlichen, dass beide gleich sind.
document.location === window.location
kehrt zurück true
ebenfalls
document.location.constructor === window.location.constructor
ist true
Hinweis: Gerade getestet auf Firefox 3.6, Opera 10 und IE6
===
und ==
sind gleichwertig.
"abc" == new String("abc")
Rückkehr true
während "abc" === new String("abc")
Rückkehr false
.
==
und ===
gleichwertig sind. Siehe die Spezifikationsabschnitte 11.9.3 und 11.9.6. Für Nicht-Null-, Nicht-Undefinierte, Nicht- ==
Zahlen- , Nicht-Bool-, Nicht-String-Werte mit demselben Typ wird das Verhalten von 11.9.3 Teil 1f und das ===
Verhalten von 11.9.6 Teil 7 bestimmt, die identisch Return true
iffalse
document.location
und window.location
auf Objekte zeigen. Sie vermissen den ganzen Punkt von Triple Equals; Die Verwendung von 2 gleich beweist nicht, dass sie dasselbe Objekt sind. Wir sollten 3 gleiche und nicht 2 gleiche verwenden, da 2 gleiche uns ein falsches Positiv geben. In einem Browser, in dem document.location eine URL-Zeichenfolge ist, die gleich true ist window.location.toString()
, document.location==window.location
wird true zurückgegeben, während document.location===window.location
false zurückgegeben wird.
document.location === window.location
Vergleich betrifft. Die Tatsache, dass der .constructor
Vergleich ebenfalls eingeworfen wird, bedeutet meiner Meinung nach, dass diese Antwort immer noch richtig ist, aber die Verwendung ===
würde die Argumentation vereinfachen.
Ja, sie sind gleich. Dies ist eine der vielen historischen Macken in der JS-API des Browsers. Versuchen Sie Folgendes:
window.location === document.location
Es ist heutzutage selten, den Unterschied zu sehen, da HTML 5 keine Framesets mehr unterstützt. Zu der Zeit, als wir ein Frameset hatten, leitete document.location nur den Frame um, in dem Code ausgeführt wird, und window.location leitete die gesamte Seite um.
Ich würde sagen, window.location
ist der zuverlässigere Weg, um die aktuelle URL zu erhalten . Das Folgende ist der Unterschied zwischen dem window.location
und dem document.url
, der in einem der Szenarien, in denen ich Hash-Parameter in die URL angehängt und später gelesen habe, vorgekommen ist.
Nach dem Hinzufügen von Hash-Parametern in der URL.
In einem älteren Browser konnte ich die Hash-Parameter nicht mithilfe von aus der URL abrufen document.url
, aber als ich sie verwendete, window.location
konnte ich die Hash-Parameter über die URL abrufen.
Es ist also immer besser zu benutzen window.location
.
document.URL
- es ging um window.location
und document.location
. Existiert document.url
auch nicht = es sollte in Großbuchstaben geschrieben werden.
document.location.constructor === window.location.constructor
ist true
.
Es ist, weil es genau das gleiche Objekt ist, von dem Sie sehen können document.location===window.location
.
Es ist also nicht erforderlich, den Konstruktor oder eine andere Eigenschaft zu vergleichen.
Nun ja, sie sind die gleichen, aber ...!
window.location
funktioniert in einigen Internet Explorer-Browsern nicht.
Obwohl die meisten Leute hier empfehlen, sah das dynamische Protokoll von Google Analytics so lange aus (bevor sie kürzlich von ga.js zu analyse.js wechselten):
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
Weitere Informationen: https://developers.google.com/analytics/devguides/collection/gajs/
In der neuen Version wurde '//' verwendet, damit der Browser automatisch das Protokoll hinzufügen kann:
'//www.google-analytics.com/analytics.js'
Wenn Google document.location dem window.location
Protokoll in JS vorzieht , haben sie vermutlich einige Gründe dafür.
GESAMT : Ich persönlich glaube das document.location
und bin window.location
das gleiche, aber wenn Riese mit den größten Statistiken über die Verwendung von Browsern wie Google mit document.location , empfehle ich, ihnen zu folgen.
Tatsächlich bemerke ich einen Unterschied in Chrome zwischen beiden. Wenn Sie beispielsweise von einem untergeordneten Frame aus zu einem Sandbox-Frame navigieren möchten, können Sie dies nur mit document.location, nicht jedoch mit window.location tun