document.defaultView有什么意义?

时间:2012-02-07 20:40:56

标签: javascript dom

document.defaultView有什么意义?

MDN says

  

在浏览器中返回与文档关联的窗口对象,如果没有,则返回null。

以下代码(来自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的我的图书馆。我不确定人们是否只是从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。我认为这可能是首选。这将获取包含节点的文档以及与之关联的窗口。如果getComputedStyleownerDocument被破坏,我会回退到当前窗口defaultView(我依稀记得getComputedStyledefaultView之前出现了defaultView。这可能更接近{{1}}的预期用途。

4 个答案:

答案 0 :(得分:9)

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

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

简而言之,我认为它与document.window类似,但不存在。

答案 1 :(得分:4)

OP询问问题," document.defaultView"的重点是什么,答案实际上与getComputedStyle没有任何关系。如果document.defaultView对象具有对window中包含的document对象的引用,则window属性只是获取window对象的一种方式。在某些情况下,您要引用的defaultView对象(或document)与您正在运行的代码的窗口范围不同。

这方面的一个示例是,如果您在iframe中引用了window对象,并希望方便地获取对该iframe的document对象的引用。

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

或者,正如Dagg Nabbit指出的那样,如果在任何一种情况下你都有一个对窗口内元素的引用,你可以通过element.ownerDocument.defaultView访问该元素的父IFS="\n"

答案 2 :(得分:3)

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

答案 3 :(得分:2)

根据MDN getComputedStyle article

  

在许多在线代码示例中,使用了getComputedStyle   document.defaultView对象。

     

几乎在所有情况下,这都是不必要的   getComputedStyle对象上也存在window

     

可能是   

是某种组合的defaultView模式      
      
  1. 人们不想为窗口和
  2. 编写规范   
  3. 制作一个也可以在Java中使用的API。
  4.         

    然而,defaultView的方法有a single case   必须使用:使用Firefox 3.6访问框架样式时。