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。我认为无论如何这可能是首选。这将获得包含节点的文档以及与之关联的窗口。如果getComputedStyleownerDocument损坏,它会回退到当前窗口的defaultView(我隐约记得getComputedStyledefaultView之前存在)。这可能更接近defaultView的预期用途。

最佳答案

我对此并不满意,但我想这是修复以下错误的结果:尝试在分离的文档上运行代码(即内存中存在但页面中没有的内容)或尝试在文档上运行在其他窗口(例如iframe或弹出窗口)中。

根据您的报价,当document.defaultView在不是当前文档的文档上运行时,您将获得关联的窗口对象,因此document.documentView.getComputedStyle !== getComputedStyle会因为它们处于不同的上下文中。

简而言之,我认为它类似于不存在的document.window

07-28 10:54