JavaScript:location.hrefとlocationの設定


311

設定locationとURL文字列のどちらに設定するのlocation.hrefですか?

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

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

Mozilla Developer Networkリファレンス


6
location.hrefsame-origin-policy:javascript.info/tutorial/…
Taha Jahangir '25


1
TypeScript 2.6.2を使用するAngular 4アプリがあります。window.locationは読み取り専用であり、window.location.href(角度サブスクリプションからのコールバックのコンテキストで)を使用してのみ割り当てることができ、コンパイラエラーは発生しません。 。基本的に、window.location.hrefは常に機能する唯一のもののようです。
Chris Halcrow、2018

回答:


261

location少し短いので直接設定するかもしれません。簡潔にしようとしている場合は、通常、省略することwindow.もできます。

両方へのURLの割り当てlocation.hrefとは、locationバックNetscapeの2には、JavaScript 1.0で動作するように定義され、以来、すべてのブラウザに実装されています。だからあなたのピックを取り、あなたが最もはっきりしているものを使用してください。


9
以下の回答で@SwissMisterが言及したように、window.location.hrefはXHRリクエストのように扱われるようです。XHRの成功コールバック内から起動された場合、window.locationがリンクのクリックをエミュレートする間、window.location.hrefはXHRとして扱われます。
Akshay Raje

147

両方とも機能する場合でも、後者を使用します。 locationはオブジェクトであり、オブジェクトに文字列を割り当てることは、読みやすさやメンテナンスのための良い前兆ではありません。


60
複雑なPayPalの統合を実施している間、私は使用することは非常に説得力のある理由が発生したwindow.locationそれは必要ありませんSAME ORIGIN
スイスミスター2014

4
多分それは私だけですが、location = 'http://www.example.com'とても読みやすいようです。とはいえ、特別なケースとして。これは下位互換性があり、当面は互換性を保ちます。
Alex W

10
window.locationがオブジェクトの場合、それに文字列を割り当てると、文字列で上書きされます。実際window.locationは、getterメソッドとsetterメソッドを持つプロパティです。これを設定すると、文字列が期待され、グローバルなLocationオブジェクトがセッターによって更新されます。取得すると、グローバルなLocationオブジェクトが返されます。
JukkaP 2016

64

すでに述べたようにlocation、オブジェクトです。しかし、その人はどちらかを使用することを提案しました。 しかし、あなたはその.hrefバージョンを使うほうが良いでしょう。

オブジェクトにはデフォルトのプロパティがあり、他に何も指定されていない場合は、それらが想定されます。locationオブジェクトの場合は、というプロパティがあります.href。また、割り当て時にANYプロパティを指定しないことにより、デフォルトで「href」と見なされます。

これは、新しいオブジェクトモデルのバージョンが変更され、デフォルトのプロパティがなくなるか、デフォルトのプロパティが変更されるまで、問題なく機能します。次に、プログラムが予期せず壊れます。

もし意味hrefするなら、あなたは明記すべきhrefです。


13
読みやすさやメンテナンスに関する単なる一般的なコメントよりも優れた説明。実際には、この特定のケースでは、Webの半分が停止するため、オブジェクトモデルは変更されません。したがって、どちらかを使用します...どちらでもかまいません
Neromancer '18

71
これは良さそうに聞こえますが、本当ではありません。一般に、DOMまたはJavaScriptにはデフォルトプロパティの概念はありません。文字列の割り当てがlocation機能するのは、JavaScript 1.0およびそれを実装して以来のすべてのブラウザーで、この特別な割り当て動作がプロパティに定義されているためです。HTML5で必要になりました。したがって、に割り当てる方がきれいで一貫している.href場合がありますが、下位互換性または上位互換性の利点はありません。
ボビンス

6
かわいさを数えます。
トムアンデルセン

4
window.location = urlきれいです
エリック・マイザー14

21
location = url
キュート

20

数年前は、locationIE では機能せずlocation.href、他のブラウザーでも機能していました。それ以来、私はいつも使用location.hrefしていて、二度と問題がありませんでした。IEのバージョンを覚えていません。


42
おそらく、IEの1つのバージョンで問題が発生し、他のすべてのブラウザでは正しく機能していました。;-)
Shawn D.

9
strict mode直接割り当てようとするとlocationlocation.href
Chrome

9
IEの「1」バージョン?
Lpc_dark

@Shawn D.ブラウザーは正しく動作していますか?それはいつ起こったのですか!:D
user2173353 2017

15

ただ、明確にするためにあなたが行うことができないlocation.split('#')locationオブジェクトではなく文字列です。しかし、それは文字列location.href.split('#');だからlocation.hrefです。


3
あなたのコメントは真実ですが、あなたは場所オブジェクトのhref属性、文字列を取得することについて話しているのです。他のすべての議論は、値を読み取ることではなく、値を割り当てることを扱っています。しかし、あなたの主張は正しいです。違いは、hrefは文字列であり、場所はオブジェクトです。
Phil DD

15

ただし、留意すべき違いが1つあります。

現在のURLを使用してURLを作成するとします。それが呼び出していないので、実際には次のコードの意志は、あなたをリダイレクトしString.replaceますがLocation.replace

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

次のコードが機能します。

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

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

3

TypeScriptではwindow.location.hrefwindow.location技術的には以下を含むオブジェクトをそのまま使用します。

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

設定window.locationwindow.location.href文字列型ですが、型エラーを生成し ます。

ソース

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