document.defaultView有什么意义?

Dag*_*bit 34 javascript dom

有什么意义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;
}
Run Code Online (Sandbox Code Playgroud)

像这样的代码可以在其他地方找到,比如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);
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

必须传入元素本身,而不是id.我认为这可能是首选.这将获取包含节点的文档以及与之关联的窗口.它有一个回退到当前窗口的,getComputedStyle如果ownerDocument或被defaultView打破(我依稀记得getComputedStyle在此之前defaultView).这可能更接近于预期用途defaultView.

Mar*_*ahn 10

我对此并不乐观,但我想这是修复一个错误的结果,试图在分离的文档上运行代码(即存在于内存中但不在页面中的内容)或尝试在文档上运行在不同的窗口(例如iframe或弹出窗口).

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

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

  • 不一定-正如我所说,您可以有多个不同的文档(iframe),因此它是指向该特定窗口的链接(例如,“ iframe.contentWindow”与“ window”与“ iframe2.contentWindow”)。文档也可以移动,因此即使您存储该原始链接也可以更改。我认为,这是从文档中引用“当前窗口”的安全方法 (2认同)

All*_*sso 7

OP提出问题,“的意义document.defaultView何在”,答案实际上与getComputedStyle没有任何关系。如果引用了对象中包含document.defaultViewwindow对象,则该属性只是一种获取对象的方法。在某些情况下,您要引用的对象(或)与运行的代码不在同一窗口范围内。documentwindowwindowdefaultView

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

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

或者,正如Dagg Nabbit指出的那样,如果在上述任何一种情况下您都引用了窗口中的某个元素,则可以通过以下方式访问该window元素的父元素:element.ownerDocument.defaultView