document.defaultView有什么作用?

40

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.getComputedStylewindow.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存在问题(我模糊记得在defaultView之前出现过getComputedStyle),则会回退到当前窗口的getComputedStyle。 这可能更接近defaultView的预期使用方式。


这个怎么样?documentView是对window的循环引用。https://dev59.com/w2ox5IYBdhLWcg3wekIr - Green
4个回答

15
本问询中提问者

14

我不确定,但我想这可能是修复错误的结果,因为要在分离的文档上运行代码(即存在于内存中但不在页面中的内容)或尝试在不同窗口(例如iframe或弹出窗口)中运行文档。

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

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


那么另一种表达方式是:只有当您没有与文档关联的窗口/全局句柄时,它才有用? - Dagg Nabbit
2
不一定 - 正如我所说,您可以有几个不同的文档(iframes),因此它是指向该特定窗口的链接(例如 iframe.contentWindow vs window vs iframe2.contentWindow)。文档也可能会移动,因此即使您存储了原始链接,它也可能会更改。我认为,这是从document引用current window的安全方式。 - user578895
没错。正在使用新的方案更新问题,以展示函数应该是什么样子。 - Dagg Nabbit
你觉得我在问题底部添加的内容是否正确? - Dagg Nabbit

3
根据MDN getComputedStyle文章, 在许多在线代码示例中,getComputedStyle是从document.defaultView对象中使用的。在几乎所有情况下,这是不必要的,因为getComputedStyle也存在于window对象上。很可能defaultView模式是以下两者的组合:1.人们不想为窗口编写规范;2.制作一个也可以在Java中使用的API。但是,在使用Firefox 3.6访问框架样式时,必须使用defaultView的方法,这是唯一的情况(单一案例)

5
defaultView很有用,因为你可以使用someElement.ownerDocument.defaultView,即使元素来自另一个文档/窗口,比如一个frame或者window.open等,它仍然有效。通常你看到的例子好像都没有涉及到这一点。我尝试在问题中回顾并解释了它。 - Dagg Nabbit
@DaggNabbit 正如MDN文章所说,这仅适用于Firefox 3.6。现在你可以直接使用window,它也能正常工作:演示 - Oriol
2
PPK和DM的示例让我感到困惑的是,他们使用defaultView的方式相当于使用window,因为他们只是使用全局的document属性而不是与元素相关联的文档,所以它并没有做任何有用的事情。 - Dagg Nabbit
2
@Dagg Nabbit:我认为你的第一条评论(例如someElement.ownerDocument.defaultView)是回答你发布的问题的最佳答案(在我看来,也是最有意义的),为什么不将其作为答案并接受呢? - KevinHJ

3

据我所知,它只是一种抽象概念,以防用户代理出现DOM实现,但不提供窗口形式的视图。请参见DOM 2级中的视图 (Views)


我不相信这样的UA存在? - user578895
1
DOM 2 Views已经过时了。defaultView属性现在在HTML标准中定义。 - Šime Vidas
@Šime Vidas:有趣。看起来他们把它从DOM 3中移出来,放到了HTML中。不过我现在很难浏览whatwg.org,你能提供一个链接吗?:| - BoltClock
@BoltClock 这是一个句子:http://www.whatwg.org/specs/web-apps/current-work/#dom-document-defaultview - Šime Vidas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接