什么'这是文档的要点.默认视图

What's the point of document.defaultView?

本文关键字:默认 视图 文档 什么      更新时间:2023-09-26

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的我的库。我不确定人们是否只是从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。我认为这可能是首选。这会得到包含节点的文档以及与之相关的窗口。如果ownerDocumentdefaultView坏了,它会回退到当前窗口的getComputedStyle(我模糊地记得getComputedStyledefaultView之前)。这可能更接近defaultView的预期用途。

OP问"document.defaultView有什么意义"这个问题,答案实际上与getComputedStyle无关。如果有对window中包含的document对象的引用,则document.defaultView属性只是获得window对象的一种方式。在某些情况下,您要引用的window对象(或defaultView)与您正在运行的代码不在同一窗口范围内。

其中一个例子是,如果您有对iframe中document对象的引用,并且希望方便地获得对该iframe的window对象的引用。

另一种情况可能是,您在浏览器范围内的特权上下文中运行(例如,Firefox中的chrome代码),并且您碰巧引用了选项卡浏览器或其他窗口的document对象。

或者,正如Dagg Nabbit所指出的,如果在这些情况下,您有对窗口中某个元素的引用,则可以通过element.ownerDocument.defaultView 访问该元素的父window

我对此并不肯定,但我认为这是修复了一个错误的结果,无论是试图在分离的文档上运行代码(即内存中存在但不在页面中的东西),还是试图在不同的窗口中在文档上运行(如iframe或弹出窗口)。

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

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

据我所知,这只是一个抽象,以防任何用户代理弹出DOM实现,但不提供窗口形式的视图。请参阅DOM级别2中的视图。

根据MDN getComputedStyle文章,

在许多联机代码示例中,getComputedStyle是从document.defaultView对象。

在几乎所有情况下,这都是不必要的,因为CCD_ 33也存在于CCD_。

很可能是defaultView模式是的某种组合

  1. 不想为window和
  2. 使API在Java中也可用

然而,有一种情况是defaultView的方法必须使用:当使用Firefox 3.6访问框架样式时。