他们俩都应该引用同一个对象吗?
-
有关显示其差异的用例,请参阅stackoverflow.com/a/12098898/632951
获取当前位置对象的规范方法是window.location(参见1996年的MSDN页面和2006年的W3C草案)。
将其与document.location进行比较,document.location最初仅将当前URL作为字符串返回(请参阅MSDN上的此页面)。可能为了避免混淆,document.location被替换为document.URL(参见MSDN),这也是DOM Level 1的一部分。
据我所知,所有现代浏览器都将document.location映射到window.location,但我仍然喜欢window.location,因为这是我在编写第一个DHTML后使用的。
-
如果你使用window.location,它是否同样有效,只使用location?
-
@commonpike它是 - 在[至少] HTML文档中的脚本的上下文中,所有已定义变量成为属性的全局对象是window对象。因此,您在脚本顶层定义的任何变量或函数都是window引用的对象的属性,它恰好是全局对象。当缺少像window.时暗示全局对象 - 因此location被解释为window.location。警告 - f.e.如果未定义变量,if(an_undefined_variable)将抛出错误 - if(window.an_undefined_variable)不会。
根据W3C,它们是相同的。实际上,对于跨浏览器安全性,您应该使用window.location而不是document.location。
请参阅:http://www.w3.org/TR/html/browsers.html#dom-location
-
在历史上,他们不是(但没有downvote)
-
Downvoted。回答矛盾。它大胆地说它们是相同的,然后描述了较轻文本的差异。他们显然不一样。
-
C'mon触发 - 快乐的选民,减轻了一点。在大多数情况下,他们的行为类似于考虑rahul指定的CAVEAT。我们不要把他钉在语义上。一位小费城,先生们。我,一个人,发现他的答案完全令人满意。 +1(Christoph's应该是公认的答案,但rahul是可以接受的 - 至少,不值得投票。)
-
-1表示推荐最佳实践(总是使用window.location)而不提供任何理由。如果您不提供理由,为什么有人会接受您的建议?克里斯托夫的回答在这方面更有用。
-
+1,但也看到Phil Hamer和Christoph的答案,他们添加了必要的背景信息和警告,以充分理解这个问题。
-
实际上我注意到两者之间存在差异,例如,如果您想从子框架导航到沙盒框架,那么您可以使用document.location而不是window.location执行此操作
window.location在所有兼容的浏览器上都是可读/写的。
document.location在Internet Explorer中是只读的(至少),但在基于Gecko的浏览器(Firefox,SeaMonkey)中是可读/写的。
-
我无法重现document.location在IE中只读的说法。我可以在IE 10,9,8和6中成功分配它(使用来自modern.ie的VM)。
-
对console.log(location);的任何评论?!!
document.location最初是一个只读属性,但Gecko浏览器也允许您分配它。对于跨浏览器安全性,请改用window.location。
阅读更多:
document.location
window.location
有趣的是,如果你有一个名为"location"的框架,图像或表单,那么'document.location'分别提供对框架窗口,图像或表单的引用,而不是Location对象。显然,这是因为document.forms,document.images和window.frames集合名称查找优先于映射到window.location。
1 2 3
| <img name='location' src='location.png'>
if (document.location.tagName == 'IMG') alert('Hello!') |
-
没有优先权,它只是被覆盖
-
不,它没有被覆盖。这是阴影,所以Phil在属性解析过程中优先考虑元素。
-
@kangax,好像你是对的:jsfiddle.net/uL4ysszr。但这种行为有多可靠?它是否足够跨浏览器?
-
不幸的是,我认为它非常适合跨浏览器。没有时间检查,但IIRC你应该能够找到HTML5中规定的这种行为。
-
刚试过这个(2016年10月)。似乎window.location??和document.location无法在Chrome或Firefox中显示阴影。
-
@ Mr.Llama你是对的。似乎所有现代浏览器都不再按照我上面描述的方式运行。这似乎是由于给document.location提供了"Unforgeable"属性。相关的Chromium更改:src.chromium.org/viewvc/blink?view=revision&revision=189862和Firefox错误:bugzilla.mozilla.org/show_bug.cgi?id=1133760
据我所知,两者都是一样的。对于跨浏览器安全性,您可以使用window.location而不是document.location。
所有现代浏览器都将document.location映射到window.location,但我仍然喜欢window.location,因为这是我在编写第一个网页后使用的内容。它更加一致。
您还可以看到document.location === window.location返回true,这表明两者都是相同的。
document.location === window.location返回true
也
document.location.constructor === window.location.constructor是true
注意:刚刚测试过,Firefox 3.6,Opera 10和IE6
-
你应该使用3等于....
-
@Pacerier为什么?对于对象,===和==是等效的。
-
@MarkAmery,这是错误的并且可以很容易地证明:"abc" == new String("abc")返回true而"abc" === new String("abc")返回false。
-
@Pacerier好吧,让我稍微说一点,不要含糊不清:当比较两个对象(而不仅仅是一个有任何东西的对象)时,==和===是等价的。请参阅规范部分11.9.3和11.9.6。对于具有相同类型的非null,非undefined,非数字,非bool,非字符串值,==行为由11.9.3 part 1f控制,===行为由11.9.6 part 7控制,如果x和y指向同一个对象,则同样读取Return true。否则,返回false。
-
@MarkAmery,无法保证document.location和window.location都指向对象。你错过了三等于它的全部意义;使用2等于并不能证明它们是相同的对象。我们应该使用3个等于而不是2个等于因为2个等于将给我们一个假阳性。在document.location是一个等于window.location.toString()的URL字符串的浏览器上,然后document.location==window.location将返回true,而document.location===window.location将返回false。
-
@Pacerier啊哈 - 我终于明白了。你是完全正确的,至少就document.location === window.location的比较而言。我认为,抛出.constructor比较的事实意味着这个答案仍然合理,但使用===会简化推理。
-
@MarkAmery,它仍然会失败并在允许覆盖String或Number或Boolean实例的.constructor属性的浏览器上给出误报。简而言之,你的代码可能会起作用,但绝对不是跨浏览器,因此它不能证明它应该证明什么。
是的,他们是一样的。这是浏览器JS API中众多历史怪癖中的一个。尝试做:
1
| window.location === document.location |
考虑到旧的浏览器,window.location是两者中更可靠的一致性。
现在很难看到差异,因为html 5不再支持框架集了。但是当我们有框架集时,document.location将仅重定向正在执行代码的框架,window.location将重定向整个页面。
我会说window.location是获取当前URL的更可靠方式。
以下是我在URL中附加哈希参数并稍后阅读它的场景之一中出现的window.location和document.URL之间的区别。
在URL中添加哈希参数后。
在较旧的浏览器中,我无法使用document.URL从URL获取哈希参数,但是当我使用window.location时,我能够从URL获取哈希参数。
所以使用window.location总是更好。
-
哪个浏览器?
-
-1。问题甚至没有提到document.URL - 它是关于window.location和document.location。此外,document.URL不存在=它应该是大写的。
至少在IE中,它在本地文件上有一点差别:
document.URL将返回
"文件:// C:项目 ABC a.html"
但是window.location.href将返回
"文件:/// C:/projects/abc/a.html"
一个是反斜杠,一个是正斜线。
好吧,他们是一样的,但......!
window.location无法在某些Internet Explorer浏览器上运行。
document.location.constructor === window.location.constructor是true。
这是因为它与document.location===window.location中的对象完全相同。
所以没有必要比较构造函数或任何其他属性。
实际上我注意到两者之间的chrome差异,例如,如果你想从子框架导航到沙盒框架,那么你可以只使用document.location而不是window.location
尽管大多数人都推荐这里,但谷歌分析的动态协议剪辑看起来好像很久(在他们最近从ga.js转移到analytics.js之前):
1
| ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; |
更多信息:https://developers.google.com/analytics/devguides/collection/gajs/
在新版本中,他们使用'//',因此浏览器可以自动添加协议:
1
| '//www.google-analytics.com/analytics.js' |
因此,如果Google在JS中需要协议时更喜欢document.location到window.location,我猜他们有一些理由。
总的来说:我个人认为document.location和window.location是相同的,但如果有关使用document.location等谷歌浏览器使用率最高的巨人,我建议关注它们。
-
请关注解释downvote的原因?
-
然而,我并没有贬低,这可能是因为这是一个非常古老的问题而且你的答案并没有提供任何新的或有价值的证据证明一个人比另一个更好。或者,这可能是因为你的回答暗示了公众舆论的反面,无论你给谷歌历史上所做的贡献多少。或者,可能是downvoter只是不喜欢你如何把重点放在你真正需要强调的部分答案上。可能是真的。这就是SO上匿名投票的美妙之处。