Javascript:设置location.href与location


311

什么时候设置locationURL字符串而不是设置location.href

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

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

Mozilla开发人员网络参考


6
设置location.href邮件失败,因为同源策略的:javascript.info/tutorial/...
塔哈·贾汉吉尔


1
我有一个使用TypeScript 2.6.2的Angular 4应用程序。window.location是只读的,我只能使用window.location.href进行分配(在来自角度订阅的回调的上下文中),而不会引起编译器错误-可能是某种JavaScript 1.0兼容性或与异步处理有关。基本上,window.location.href似乎是唯一始终有效的东西。
克里斯合乐

Answers:


261

您可能会location直接设置,因为它稍短一些。如果您要简洁,通常也可以忽略window.

URL分配到两个location.hreflocation被定义为工作在JavaScript 1.0,早在网景2,并已在因为每一个浏览器来实现。因此,请选择并使用最清晰的内容。


9
就像@SwissMister在下面的答案中提到的那样,似乎window.location.href在某种程度上被视为XHR请求。如果从XHR的成功回调中触发,则window.location.href将被视为XHR,而window.location模拟单击链接。
Akshay Raje

147

即使两者都能工作,我还是会使用后者。 location是一个对象,为该对象分配字符串对于可读性或维护性而言并不是一个好兆头。


60
在实施复杂的PayPal集成时,我遇到了一个非常令人信服的理由window.location不需要SAME ORIGIN
瑞士先生2014年

4
也许只有我一个人,但location = 'http://www.example.com'看起来超级可读。尽管是特例。这是向后兼容的,并将在可预见的将来保持兼容
亚历克斯W

10
如果window.location是对象,则为其分配字符串将用字符串覆盖它。实际上,window.location是具有getter和setter方法的属性。设置它时,需要一个字符串,并且设置器会更新全局Location对象。获取它时,将返回全局Location对象。
JukkaP

64

就像已经说过的,location是一个物体但是那个人建议使用两者之一。 但是,使用该.href版本会更好。

对象具有默认属性,如果未指定其他属性,则假定为默认属性。对于该location对象,它具有称为的属性.href。通过在分配过程中未指定ANY属性,默认情况下它将采用“ href”。

一切都很好,直到以后的对象模型版本更改并且不再有默认属性或更改了默认属性为止。然后,您的程序意外中断。

如果您的意思是href,您应该指定href


13
好的解释,不仅仅只是关于可读性或维护性的一般性评论。实际上,在这种特定情况下,对象模型将不会更改,因为一半的Web都将停止-因此可以使用任何一个...都没关系
Neromancer 2012年

71
这听起来不错,但实际上并非如此。通常,在DOM或JavaScript中没有默认属性的概念。分配字符串可以location工作是因为在JavaScript 1.0中,该属性已定义为具有这种特殊的分配行为,并且此后的每个浏览器都已实现了该功能。HTML5现在需要它。因此,尽管分配给它可能更漂亮或更一致.href,但是这样做没有向后或向前兼容性的优势。
bobince 2012年

6
美貌很重要。
汤姆·安德森

4
window.location = url更漂亮
Eric Muyser 2014年

21
location = url更可爱
fregante

20

几年前,它location在IE中对我不起作用,但确实起作用location.href(并且在其他浏览器中都起作用)。从那时起,我一直只使用过location.href,不再遇到麻烦。我不记得是哪个版本的IE。


42
可能是一个版本的IE出现了错误,而其他所有浏览器都正确地执行了。;-)
Shawn D.

9
strict mode如果您也尝试直接分配给chrome,则在chrome中会抛出异常location,因此我始终使用location.href
Hashbrown

9
IE的“一个”版本?
Lpc_dark

@Shawn D.浏览器正确运行吗?什么时候发生的!:D
user2173353 '17

15

只是为了澄清,你不能这样做location.split('#')location是一个对象,而不是字符串。但是您可以这样做,location.href.split('#');因为它location.href是一个字符串。


3
您的评论是正确的,但是您正在谈论获取位置对象的href属性(字符串)。所有其他讨论都在处理分配值,而不是读取值。但是你的观点是正确的。区别在于href是一个字符串,而location是一个对象。
Phil DD

15

但是要记住一个区别。

假设您要使用当前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

与打字稿使用window.location.hrefwindow.location在技术上包含一个对象:

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

设置window.location将产生类型错误,而设置 window.location.href为字符串类型。

资源

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.