在JavaScript中的window.location和document.location之间有什么区别?

他们是否应该引用同一个对象?

根据W3C,他们是一样的。 实际上,为了跨浏览器的安全性,你应该使用window.location而不是document.location

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

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

将它与document.location进行比较,最初只以stringforms返回当前URL(请参阅MSDN上的此页 )。 可能为了避免混淆, document.location被replace为document.URL (参见MSDN ),这也是DOM Level 1的一部分。

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

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

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

document.location最初是一个只读属性,尽pipeGecko浏览器也允许你指定它。 为了实现跨浏览器的安全性,请改用window.location

阅读更多:

document.location

window.location

有趣的是,如果您有一个名为“位置”的框架,图像或表单,则“document.location”分别提供对框架窗口,图像或表单的引用,而不是位置对象。 显然,这是因为document.forms,document.images和window.frames集合名称查找优先于映射到window.location。

 <img name='location' src='location.png'> if (document.location.tagName == 'IMG') alert('Hello!') 

据我所知,两者都是一样的。 为了跨浏览器安全,您可以使用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.constructortrue

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

是的,他们是一样的。 这是浏览器JS API中的许多历史怪癖之一。 尝试做:

 window.location === document.location 

考虑到旧版浏览器,window.location是两者之间更可靠的一致。

我会说window.location是获取当前URL的更可靠的方法。 以下是我之前在URL中附加哈希参数并稍后阅读的场景中的window.locationdocument.url之间的区别。

在URL中添加散列参数之后。

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

所以最好使用window.location

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

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

所以没有必要比较构造函数或其他属性。

至less在IE中,它在本地文件上有一点区别:

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

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

一个是斜杠,一个是斜线。

好吧,他们是一样的,但是….!

window.location不适用于某些Internet Explorer浏览器。

现在很less见到这种差异,因为html 5不再支持框架集。 但是,在我们有frameset的时候,document.location只会redirect正在执行代码的框架,window.location会redirect整个页面。

尽pipe大多数人都在这里推荐,但Google Analytics(分析 )的dynamic协议剪切方式看起来好像很长时间(最近从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/

在新版本中,他们使用“//”,所以浏览器可以自动添加协议:

 'analytics.js' 

因此,如果Google需要在JS中使用协议时将document.location更改为window.location ,我想他们有一些原因。

总而言之 :我个人认为document.locationwindow.location是一样的,但是如果使用document.location的浏览器使用率最高,那么我build议遵循它们。