JavaScriptのwindow.locationとdocument.locationの違いは何ですか?


回答:


220

W3Cによると、それらは同じです。実際には、クロスブラウザーの安全性のために、window.locationではなくを使用する必要がありますdocument.location

参照:http : //www.w3.org/TR/html/browsers.html#dom-location


12
反対投票。矛盾する答えを。それらは大胆に同じであると述べ、次に軽いテキストの違いを説明します。彼らは明らかに同じではありません。
danorton、2012

33
引き金を引くハッピーダウンボーター、少し明るくしてください。ほとんどの場合、それらはrahulによって指定された警告を考慮して同様に動作します。セマンティクスに彼を釘付けにしましょう。少しフィラデルフィア、紳士。私は、一つには、彼の答えは完全に満足のいくものだと思った。+1(クリストフの答えが受け入れられるべきですが、ラフルの答えは受け入れられます-少なくとも、反対票に値しません。)
cssyphus

7
-1はwindow.location、正当な理由を提供せずにベストプラクティス(常にを使用)を推奨する場合。正当な理由を提供しないのであれば、なぜ誰かがあなたのアドバイスをするべきなのでしょうか?クリストフの答えはこの点ではるかに有用です。
マークアメリー2014

+1は、下記のPhil HamerとChristophの回答も参照してください。問題を完全に理解するために、重要な背景情報と警告が追加されています。
Jon z

実際、私は両方の違いに気づきます。たとえば、子フレームからサンドボックス化されたフレームへのナビゲーションを実行する場合、これはdocument.locationでのみ実行できますが、window.locationでは実行できません
M.Abulsoud

207

現在の場所オブジェクトを取得する正規の方法window.location次のとおりです(1996年のこのMSDNページ2006年のW3Cドラフトを参照してください)。

これをdocument.location、元の現在のURLのみを文字列として返したと比較してくださいMSDNのこのページを参照)。おそらく混乱を避けるために、これはDOM Level 1の一部でもある(MSDNのこちらを参照)document.locationに置き換えられました。document.URL

私の知る限り、すべての最新のブラウザーはにマップさdocument.locationれますwindow.locationwindow.location、私は最初のDHTMLを作成して以来、これを使用してきたので、それでも好みです。


1
を使用する場合、使用window.locationするだけで同等に有効ではありませんlocationか?
commonpike 2016年

2
@commonpike-少なくともHTMLドキュメント内のスクリプトのコンテキストでは、定義されたすべての変数がプロパティになるグローバルオブジェクトがwindowオブジェクトです。したがって、スクリプトの最上位で定義する変数または関数は、によって参照されるオブジェクトのプロパティでありwindow、これはたまたまグローバルオブジェクトです。のように存在しない場合、グローバルオブジェクトは暗黙指定されますwindow.-したがってlocation、解釈されますwindow.location。警告- if(an_undefined_variable)変数が定義されていない場合、fe はエラーをスローします-定義しif(window.an_undefined_variable)ません。
amn

92

window.locationは、すべての準拠ブラウザーで読み取り/書き込み可能です。

document.locationはInternet Explorerでは(少なくとも)読み取り専用ですが、Geckoベースのブラウザー(Firefox、SeaMonkey)では読み取り/書き込み可能です。


10
document.locationIEで読み取り専用の要求を再現できません。IE 10、9、8、6で正常に割り当てることができます(modern.ieの VMを使用)。
マークアメリー2014

のコメントconsole.log(location);?!!
Fr0zenFyr 2017

44

document.locationもともとは読み取り専用のプロパティでしたが、Geckoブラウザーを使用してこれを割り当てることもできます。ブラウザ間の安全のために、window.location代わりに使用してください。

続きを読む:

document.location

window.location


それらのどれを使用するべきか明確な答えが見つかりません。以下の私の答えを見てください
M.Abulsoud

37

興味深いことに、「location」という名前のフレーム、画像、またはフォームがある場合、「document.location」は、Locationオブジェクトの代わりに、それぞれフレームウィンドウ、画像、またはフォームへの参照を提供します。どうやら、これはdocument.forms、document.images、およびwindow.framesコレクション名のルックアップがwindow.locationへのマッピングよりも優先されるためです。

<img name='location' src='location.png'>

if (document.location.tagName == 'IMG') alert('Hello!')

2
優先順位はなく、単に上書きされます
Pacerier 2013年

7
いいえ、上書きされません。陰になっているので、フィルはプロパティ解決中に優先される要素について正しいです。
kangax 2013

@kangax、あなたは正しいようです:jsfiddle.net/uL4ysszr。しかし、この動作はどの程度信頼できるのでしょうか。それは十分にクロスブラウザですか?
Pacerier 2014年

1
これをテストしました(2016年10月)。と思わwindow.location及びdocument.locationクロムまたはFirefoxでシャドーイングすることはできません。
Llama氏、

1
@ Mr.Llamaそうですね。最近のブラウザはすべて、私が上記で説明した方法で動作しなくなったようです。これは、document.locationに「Unforgeable」属性を指定したことが原因であると思われます。関連するChromiumの変更:src.chromium.org/viewvc/blink?view=revision & revision=189862そしてFirefoxのバグ:bugzilla.mozilla.org/show_bug.cgi
Phil Hamer

27

私の知る限り、どちらも同じです。クロスブラウザーの安全性のために、window.locationではなくを使用できますdocument.location

すべての最新のブラウザーはにマップさdocument.locationれますが、私が最初のWebページを作成して以来、私はそれを使用しているので、window.locationそれでも好みwindow.locationです。より一貫性があります。

また、document.location === window.locationreturns も表示されtrue、両方が同じであることを明確に示しています。


14

document.location === window.location 戻り値 true

また

document.location.constructor === window.location.constructor です true

注:、Firefox 3.6、Opera 10、IE6でテスト済み


1
@Pacerierなんで?オブジェクトの場合、===および==等価です。
マークアメリー2014

4
@MarkAmery、それは間違っていると簡単に証明することができる。"abc" == new String("abc")戻りtrueながら、"abc" === new String("abc")リターンfalse
Pacerier 2014

7
オーケー@Pacerier、もう少し厳密かつ少ない曖昧ことを私の状態を聞かせて:比較するときに2つのオブジェクトを(むしろ何で単なるオブジェクト以外)お互いに、==そして===等価です。仕様のセクション11.9.3および11.9.6を参照してください。null以外の場合は、非未定義、非数、非ブール値は、同じタイプの非文字列の値は、==動作は11.9.3一部の1F、とに支配され===、同一読み11.9.6パート7で動作戻るtrue場合xとyは同じオブジェクトを参照します。それ以外の場合は、を返しfalseます。
マークアメリー2014

10
@MarkAmeryがあり、両方ともその保証するものではありませんdocument.locationし、window.locationオブジェクトを指しています。あなたはトリプルイコールの全体のポイントを逃しています。2つのequalsを使用しても、それらが同じオブジェクトであることは証明さません2つのイコールは偽陽性をもたらすため、2つのイコールではなく3つのイコールを使用する必要があります。document.locationは、URL文字列であることにより、ブラウザ上に等しいwindow.location.toString()、そして、document.location==window.location真の間を返しますdocument.location===window.locationfalseを返します。
Pacerier 2014年

@Pacerier Aha-ようやく手に入れました。少なくともdocument.location === window.location比較する限り、あなたはまったく正しいです。.constructor比較もスローされているという事実は、この答えはまだ正しいと私は思いますが、使用===すると推論が簡単になります。
Mark Amery 2014年

11

はい、同じです。これは、ブラウザのJS APIにおける多くの歴史的癖の1つです。やってみてください:

window.location === document.location

8

古いブラウザを考慮すれば、window.locationは2つの中でより確実に一貫しています。


3

html 5がフレームセットをサポートしなくなったため、最近ではその違いを見ることはほとんどありません。しかし、フレームセットを作成した時点では、document.locationはコードが実行されているフレームのみをリダイレクトし、window.locationはページ全体をリダイレクトします。


2

私はwindow.location、現在のURLを取得するより信頼性の高い方法だと思います。以下は、URLにハッシュパラメータを追加して後で読むシナリオの1つで前に出てきたwindow.locationとの違いdocument.urlです。

URLにハッシュパラメータを追加した後。

古いブラウザでは、私が使用してURLからハッシュパラメータを取得することができませんでしたdocument.urlが、私が使用したときにwindow.location、私はURLからハッシュパラメータを取得することができました。

したがって、常にを使用することをお勧めしますwindow.location


1
-1。質問にも言及しなかったdocument.URL-それはについてだったwindow.locationdocument.location。また、document.url存在しない=大文字にする必要があります。
マークアメリー2014

2

document.location.constructor === window.location.constructorですtrue

これは、から確認できるのとまったく同じオブジェクトだからdocument.location===window.locationです。

したがって、コンストラクタやその他のプロパティを比較する必要はありません。


2

少なくともIEでは、ローカルファイルに少し違いがあります。

document.URLは "file:// C:\ projects \ abc \ a.html"を返します

しかしwindow.location.hrefは "file:/// C:/projects/abc/a.html"を返します

1つはバックスラッシュ、もう1つはフォワードスラッシュです。


2

ええと、彼らは同じですが、....!

window.location 一部のInternet Explorerブラウザでは動作しません。


0

ほとんどの人がここで推奨していますが、Googleアナリティクスの動的プロトコルは、年齢を問わずこのように見えました(最近、ga.jsからanalytics.jsに移行する前)。

ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';

詳細: https : //developers.google.com/analytics/devguides/collection/gajs/

新しいバージョンでは、「//」を使用して、ブラウザが自動的にプロトコルを追加できるようにしました。

'//www.google-analytics.com/analytics.js'

したがって、GoogleがJSでプロトコルを必要とするときよりもdocument.locationを好む場合window.location、それらにはいくつかの理由があると思います。

全体:私は個人的には同じであるdocument.locationと信じていwindow.locationますが、document.locationを使用したGoogleなどのブラウザーの使用に関する最大の統計情報を持つ巨人の場合は、それに従うことをお勧めします。


2
私は反対票を投じませんでしたが、これは本当に古い質問であり、あなたの回答が一方が他方よりも優れているという新しいまたは貴重な証拠を提供していないためである可能性があります。あるいは、Googleがこれまでに行ってきたことに与えるメリットに関係なく、あなたの回答が世論の反対を示唆しているためかもしれません。または、実際に強調する必要のない回答の部分にどのように重点を置くかについて、反対投票者が気に入らなかった可能性もあります。本当に何でもかまいません。それがSOでの匿名投票の魅力です。
M.バブコック

0

実際には、両方のクロムの違いに気づきます。たとえば、子フレームからサンドボックス化されたフレームへのナビゲーションを実行したい場合、これはdocument.locationでのみ実行できますが、window.locationでは実行できません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.