JavaScript中window.location和document.location有什么区别?


Answers:


220

根据W3C,它们是相同的。实际上,出于跨浏览器安全的考虑,您应该使用window.location而不是document.location

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


12
不赞成投票。回答矛盾。它大胆地说它们是相同的,然后在较浅的文本中描述差异。他们绝对不一样。
danorton

33
来吧,触发快乐的选民,减轻一下。在大多数情况下,考虑到rahul指定的CAVEAT,它们的行为类似。我们不要在语义上给他钉钉子。几个费城,先生们。我发现他的回答完全令人满意。+1(克里斯托夫的答案应该被接受,但拉胡尔的答案是可以接受的-至少,不值得投票。)
cssyphus 2012年

7
-1用于推荐最佳做法(始终使用window.location),而没有提供任何理由。如果您不提供理由,为什么有人应该听取您的建议?Christoph的回答在这方面要有用得多。
Mark Amery 2014年

+1,但下面还会看到Phil Hamer和Christoph的答案,他们添加了必要的背景信息和注意事项以完全理解问题。
2014年

实际上,我注意到两者之间的区别,例如,如果您想从子框架导航到沙盒框架,则可以仅使用document.location而不使用window.location
M.Abulsoud

207

获取当前位置对象的规范方法是window.location(请参见1996年的MSDN页面2006 的W3C草案)。

将此与进行比较document.location,后者最初仅将当前URL作为字符串返回(请参见MSDN上的此页面)。可能是为了避免混淆,document.location已替换为document.URL(请参见MSDN上的此处),它也是DOM Level 1的一部分。

据我所知,所有现代浏览器都映射document.locationwindow.location,但是我仍然更喜欢,window.location因为这是我编写第一个DHTML以来使用的。


1
如果使用window.location,则使用是否同样有效location
commonpike

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 )。
Mark Amery 2014年

有任何评论console.log(location);吗?!
Fr0zenFyr


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

7
不,它不会被覆盖。它已被遮盖,因此Phil在属性解析期间优先考虑元素是正确的。
kangax

@kangax,似乎您是正确的:jsfiddle.net/uL4ysszr。但是这种行为有多可靠?跨浏览器是否足够?
Pacerier 2014年

1
刚刚对此进行了测试(2016年10月)。看来,window.location并且document.location不能在Chrome或Firefox被隐藏。
骆马先生

1
@拉玛先生你是对的。看来所有现代浏览器都不再像我上面描述的那样运行。这似乎是由于给document.location提供了“ Unforgeable”属性。相关的铬更改:src.chromium.org/viewvc/blink?view=revision & revision=189862和Firefox错误:bugzilla.mozilla.org/show_bug.cgi?
Phil Hamer

27

据我所知,两者是相同的。为了确保跨浏览器的安全,您可以使用window.location而不是document.location

所有现代浏览器都映射document.locationwindow.location,但是我仍然更喜欢,window.location因为这是我编写第一个网页以来使用的方式。它更加一致。

您还可以看到document.location === window.locationreturn true,这表明两者相同。


14

document.location === window.location 退货 true

document.location.constructor === window.location.constructortrue

注意:刚刚在Firefox 3.6,Opera 10和IE6上进行了测试


1
@Pacerier为什么?对于对象,===并且==是等价的。
Mark Amery 2014年

4
@MarkAmery,这是错误的,可以很容易地证明:"abc" == new String("abc")回报true,而"abc" === new String("abc")回报false
Pacerier,2014年

7
@Pacerier好吧,我想指出稍微更严格,少模棱两可:当比较两个对象相互(而不是仅仅与任何对象),=====是等价的。参见规范第11.9.3和11.9.6节。对于非空,非未定义,非数字的,非布尔,具有相同类型的非字符串值,==行为是由11.9.3部分1f中,并且支配===行为由11.9.6部分7,其相同地读true,如果x和y指向同一对象。否则,返回false
Mark Amery 2014年

10
@MarkAmery,不能保证document.locationwindow.location都指向对象。您错过了三等分的全部知识;使用2等于并不能证明它们是相同的obj。我们应该使用3个等值而不是2个等值,因为2个等值会给我们带来误报。在document.location是等于的URL字符串的浏览器上window.location.toString(),然后document.location==window.location将返回true,而document.location===window.location将返回false。
Pacerier,2014年

@Pacerier Aha-我终于明白了。您是非常正确的,至少就document.location === window.location比较而言。.constructor我认为,进行比较的事实也意味着这个答案仍然是正确的,但是使用===它将简化推理。
Mark Amery 2014年


8

考虑到较旧的浏览器,window.location是两者中更可靠的一致性。


3

如今很少见到这种差异,因为html 5不再支持框架集。但是回到那时我们有了框架集,document.location将仅重定向正在执行代码的框架,而window.location将重定向整个页面。


2

我想说的window.location是获取当前URL的更可靠的方法。以下是在一种情况下出现的window.location和之间的区别document.url,在这种情况下,我在URL中附加了哈希参数,然后再阅读。

在URL中添加哈希参数之后。

在较旧的浏览器中,我无法使用来从URL中获取哈希参数document.url,但是当我使用时,window.location便能够从URL中获取哈希参数。

因此使用总是更好window.location


1
-1。这个问题甚至都没有提到document.URL-关于window.locationdocument.location。另外,document.url不存在=应该为大写。
Mark Amery 2014年

2

document.location.constructor === window.location.constructortrue

这是因为它与您从中看到的对象完全相同document.location===window.location

因此,无需比较构造函数或任何其他属性。


2

至少在IE中,它与本地文件略有不同:

document.URL将返回“ file:// C:\ projects \ abc \ a.html”

但是window.location.href将返回“ file:/// C:/projects/abc/a.html”

一个是反斜杠,一个是正斜杠。


2

是的,他们是一样的,但是....!

window.location 在某些Internet Explorer浏览器上不起作用。


0

尽管大多数人在这里建议,但这是经过一段时间的Google Analytics(分析)动态协议的外观(在最近从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'

因此,如果谷歌喜欢document.locationwindow.location时,他们需要在JS协议,我想他们有一些理由。

总的来说:我个人认为document.locationwindow.location相同,但是如果巨人对使用document.location的类似Google之类的浏览器具有最大的统计数据,我建议您遵循它们。


2
我没有拒绝投票,但是,可能是因为这是一个非常老的问题,并且您的答案没有提供任何新的或有价值的证据,表明一个比另一个更好。或者,可能是因为您的回答暗示了公众舆论的反面,而不论您对Google过去所做的工作有何评价。或者,可能是拒绝投票的人只是不喜欢您如何将答案重点放在真正不需要强调的部分。真的可以是任何东西。这就是对SO进行匿名投票的好处。
巴比科克(M.Babcock)'17年

0

实际上,我注意到两者之间的chrome有所不同,例如,如果您想从子框架导航到沙盒框架,则可以仅使用document.location而不使用window.location进行导航

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.