![](/img/trans.png)
[英]Javascript document.defaultView or document.styleSheets?
[英]What's the point of document.defaultView?
document.defaultView
什么意义?
MDN说 :
在浏览器中返回与文档关联的窗口对象,如果没有,则返回null。
像以下代码(来自PPK的网站 )使用document.defaultView
:
function getStyle(el,styleProp)
{
var x = document.getElementById(el);
if (x.currentStyle)
var y = x.currentStyle[styleProp];
else if (window.getComputedStyle)
var y = document.defaultView.getComputedStyle(x,null).getPropertyValue(styleProp);
return y;
}
像这样的代码可以在其他地方找到,比如David Mark的My Library 。 我不确定人们是否只是从PPK或其他来源复制或独立提出,但我不明白。
我的问题是,在这种情况下使用document.defaultView
有什么意义? 写这个不是更容易如下:
function getStyle(element, styleProp) {
if (element === ''+element) element = document.getElementById(element);
return element.currentStyle ? element.currentStyle[styleProp] :
getComputedStyle(x,null).getPropertyValue(styleProp);
}
document.defaultView.getComputedStyle
做了什么window.getComputedStyle
或者只是getComputedStyle
没有?
cwolves的回答让我思考正确的方向。 原来的功能很傻,缺少defaultView
的观点。 我上面提出的建议不那么愚蠢,但也缺少defaultView
的观点。 这是我的新提案:
function getStyle(element, styleProp) {
var view = element.ownerDocument && element.ownerDocument.defaultView ?
element.ownerDocument.defaultView : window;
return view.getComputedStyle ?
view.getComputedStyle(element,null).getPropertyValue(styleProp) :
element.currentStyle ?
element.currentStyle[styleProp] : null;
}
必须传入元素本身,而不是id。 我认为这可能是首选。 这将获取包含节点的文档以及与之关联的窗口。 如果ownerDocument
或defaultView
被破坏,它会回getComputedStyle
当前窗口的getComputedStyle
(我getComputedStyle
记得getComputedStyle
在defaultView
之前出现)。 这可能更接近defaultView
的预期用途。
我对此并不乐观,但我认为这是修复一个错误的结果,试图在分离的文档上运行代码(即存在于内存中但不在页面中的内容)或尝试在文档上运行在不同的窗口(例如iframe或弹出窗口)。
根据您的引用,当document.defaultView
在不是当前文档的document.defaultView
上运行时,您将获得关联的窗口对象,因此document.documentView.getComputedStyle !== getComputedStyle
因为它们位于不同的上下文中。
简而言之,我认为它类似于不存在的document.window
。
OP问了一个问题,“ document.defaultView
有什么意义”,答案真的与getComputedStyle没有任何关系。 document.defaultView
属性只是获取window
对象的一种方法,如果有一个window
对象包含该window
包含的document
对象。 在某些情况下,您要引用的window
对象(或defaultView
)与您运行的代码不在同一窗口范围内。
这方面的一个示例是,如果您在iframe中引用了document
对象,并希望方便地获取对该iframe的window
对象的引用。
另一种情况可能是您在浏览器范围中的特权上下文中运行的位置(例如,Firefox中的chrome代码),并且您碰巧引用了tabbrowser或其他窗口的document
对象。
或者,正如Dagg Nabbit指出的那样,如果在任何这些情况下你有一个对窗口内元素的引用,你可以通过element.ownerDocument.defaultView
访问该元素的父window
element.ownerDocument.defaultView
就我所知,它只是一个抽象,以防任何用户代理弹出DOM实现,但不提供窗口形式的视图。 请参阅DOM级别2中的视图 。
在许多在线代码示例中,
getComputedStyle
用于document.defaultView
对象。几乎在所有情况下,这都是不必要的,因为
getComputedStyle
存在于window
对象上。它可能是defaultView模式的某种组合
- 人们不想为窗口编写规范
- 制作一个也可以在Java中使用的API。
但是,有一种情况是必须使用
defaultView
的方法:使用Firefox 3.6访问框架样式时。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.