Chr*_*oph 205

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

将此比较document.location,最初只将当前URL作为字符串返回(请参阅MSDN上的此页面).可能为了避免混淆,document.location被替换为document.URL(参见MSDN),这也是DOM Level 1的一部分.

据我所知,所有现代浏览器都映射document.location到了window.location,但我仍然喜欢window.location这样,因为我在编写第一个DHTML后就已经使用过了.

  • 如果你使用 `window.location` ,使用 `location` 不是同样有效吗? (2认同)
  • @commonpike它是 - 在[至少] HTML文档中的脚本的上下文中,所有已定义变量成为属性的全局对象是`window`对象.因此,您在脚本顶层定义的任何变量或函数都是`window`引用的对象的属性,它恰好是全局对象.当像`window`这样缺席时隐含全局对象 - 因此`location`被解释为`window.location`.注意事项 - 如果(an_undefined_variable)`如果未定义变量则会抛出错误 - if(window.an_undefined_variable)`不会. (2认同)

rah*_*hul 201

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

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

  • C'mon触发 - 快乐的选民,减轻了一点.在大多数情况下,他们的行为类似于考虑rahul指定的CAVEAT.我们不要用语义来指导他.一位小费城,先生们.我,一个人,发现他的答案完全令人满意.+1(Christoph's应该是公认的答案,但rahul是可以接受的 - 至少,不值得投票.) (28认同)
  • 在历史上,他们不是(但没有downvote) (14认同)
  • Downvoted.回答矛盾.它大胆地说它们是相同的,然后描述了较轻文本的差异.他们显然不一样. (12认同)
  • -1表示推荐最佳实践(总是使用`window.location`)而不提供任何理由.如果您不提供理由,为什么有人会接受您的建议?克里斯托夫的回答在这方面更有用. (6认同)

Fré*_*idi 92

window.location在所有兼容的浏览器上都是可读/写的.

document.location在Internet Explorer中是只读的(至少),但在基于Gecko的浏览器(Firefox,SeaMonkey)中是可读/写的.

  • 我无法重现'document.location`在IE中是只读的说法.我可以在IE 10,9,8和6中成功分配它(使用来自http://modern.ie的VM). (10认同)

diE*_*cho 44

document.location最初是一个只读属性,虽然Gecko浏览器允许您也分配给它.对于跨浏览器安全性,请window.location改用.

阅读更多:

document.location

window.location


Phi*_*mer 36

有趣的是,如果你有一个名为"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!')
Run Code Online (Sandbox Code Playgroud)

  • 不,它没有被覆盖.这是阴影,所以Phil在属性解析过程中优先考虑元素. (7认同)
  • 没有优先权,它只是被覆盖 (2认同)

Alp*_*ale 27

据我所知,两者都是一样的.对于跨浏览器安全,您可以使用window.location而不是document.location.

所有现代浏览器都映射document.location到了window.location,但我仍然喜欢window.location这样,因为我在编写第一个网页后就使用了它.它更加一致.

你也可以看到document.location === window.location回报true,这说明两者都是一样的.


YOU*_*YOU 14

document.location === window.location 回报 true

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

注意:刚刚测试过,Firefox 3.6,Opera 10和IE6

  • @MarkAmery,无法保证`document.location`和`window.location`都指向对象.你错过了三等于它的全部意义; 使用2等于**并不能证明它们是相同的对象.**我们应该使用3个equals而不是2个equals,因为2个equals会给我们一个误报.**在一个浏览器上,document.location是一个等于`window.location.toString()`的URL字符串,然后是`document. location == window.location`将返回true,而`document.location === window.location`将返回false. (9认同)
  • @Pacerier好吧,让我稍微说一点,不要含糊不清:当比较*两个对象*时(而不仅仅是一个带有任何东西的对象),`==`和`==='是等价的.见[规范](http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf)第11.9.3和11.9.6节.对于具有相同类型的非null,非未定义,非数字,非bool,非字符串值,`==`行为由11.9.3部分1f控制,而`===`行为由11.9控制. 6部分7,如果x和y指向同一个对象,则相同地读取*返回"true".否则,返回`false`.* (6认同)
  • @MarkAmery,这是错的,可以很容易地证明:`"abc"== new String("abc")`返回`true`而``abc'=== new String("abc")`返回`false`. (4认同)

Mat*_*hen 11

是的,他们是一样的.这是浏览器JS API中众多历史怪癖中的一个.尝试做:

window.location === document.location
Run Code Online (Sandbox Code Playgroud)


Dav*_*ard 8

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