在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.constructor
是true
注意:刚刚testing过,Firefox 3.6,Opera 10和IE6
是的,他们是一样的。 这是浏览器JS API中的许多历史怪癖之一。 尝试做:
window.location === document.location
考虑到旧版浏览器,window.location是两者之间更可靠的一致。
我会说window.location
是获取当前URL的更可靠的方法。 以下是我之前在URL中附加哈希参数并稍后阅读的场景中的window.location
和document.url
之间的区别。
在URL中添加散列参数之后。
在较旧的浏览器中,我无法使用document.url
从URL获取散列参数,但是当我使用window.location
时,我能够从URL获取散列参数。
所以最好使用window.location
。
document.location.constructor === window.location.constructor
是true
。
这是因为它是从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.location
和window.location
是一样的,但是如果使用document.location的浏览器使用率最高,那么我build议遵循它们。