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.locationeher 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.locationwurde durch document.URL(siehe hier auf MSDN ) ersetzt, das ebenfalls Teil von DOM Level 1 ist .
Soweit ich weiß, Karte alle modernen Browser document.locationzu window.location, aber ich immer noch lieber window.locationals 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?
windowObjekt. 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 locationals 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.locationdie 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.locationwar ursprünglich eine schreibgeschützte Eigenschaft, obwohl Sie sie auch in Gecko-Browsern zuweisen können. Verwenden Sie window.locationstattdessen 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.locationund document.locationkann nicht in Chrome oder Firefox beschattet werden.
Soweit ich weiß, sind beide gleich. Für die browserübergreifende Sicherheit können Sie window.locationeher als verwenden document.location.
Alle modernen Browser Karte document.locationzu window.location, aber ich immer noch lieber window.locationals das ist , was ich verwendet habe , seit ich meine erste Web - Seite geschrieben. es ist konsequenter.
Sie können auch document.location === window.locationRü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 truewä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 trueiffalse
document.locationund window.locationauf 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.locationwird true zurückgegeben, während document.location===window.locationfalse zurückgegeben wird.
document.location === window.locationVergleich betrifft. Die Tatsache, dass der .constructorVergleich 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.locationist der zuverlässigere Weg, um die aktuelle URL zu erhalten . Das Folgende ist der Unterschied zwischen dem window.locationund 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.locationkonnte ich die Hash-Parameter über die URL abrufen.
Es ist also immer besser zu benutzen window.location.
document.URL- es ging um window.locationund document.location. Existiert document.urlauch nicht = es sollte in Großbuchstaben geschrieben werden.
document.location.constructor === window.location.constructorist 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.locationProtokoll in JS vorzieht , haben sie vermutlich einige Gründe dafür.
GESAMT : Ich persönlich glaube das document.locationund bin window.locationdas 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