document.defaultView
的作用是什么?
MDN 上的解释如下:
在浏览器中,返回与文档相关联的窗口对象或 null(如果没有可用的窗口对象)。
以下代码(源自PPK's 站点)利用了 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
存在问题(我模糊记得在defaultView
之前出现过getComputedStyle
),则会回退到当前窗口的getComputedStyle
。 这可能更接近defaultView
的预期使用方式。
documentView
是对window
的循环引用。https://dev59.com/w2ox5IYBdhLWcg3wekIr - Green