document.defaultView
有什么意义?
MDN says:
如下代码(来自PPK's site)使用了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
不做什么?狼的回答使我思考正确的方向。原始功能很傻,缺少了
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。我认为无论如何这可能是首选。这将获得包含节点的文档以及与之关联的窗口。如果
getComputedStyle
或ownerDocument
损坏,它会回退到当前窗口的defaultView
(我隐约记得getComputedStyle
在defaultView
之前存在)。这可能更接近defaultView
的预期用途。 最佳答案
我对此并不满意,但我想这是修复以下错误的结果:尝试在分离的文档上运行代码(即内存中存在但页面中没有的内容)或尝试在文档上运行在其他窗口(例如iframe或弹出窗口)中。
根据您的报价,当document.defaultView
在不是当前文档的文档上运行时,您将获得关联的窗口对象,因此document.documentView.getComputedStyle !== getComputedStyle
会因为它们处于不同的上下文中。
简而言之,我认为它类似于不存在的document.window
。