2012-02-07 100 views
28

document.defaultView是什么意思?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; 
} 

这样的代码可以在其他地方找到像大卫?马克的我的图书馆。我不确定人们是否只是从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已损坏(我依稀记得getComputedStyle大约在defaultView之前),它回退到当前窗口的getComputedStyle。这可能更接近defaultView的预期用途。

回答

6

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

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

总之,我认为它类似于document.window,它不存在。

+0

访问该元素的父window所以会措辞的另一种方式,是,只有在你还没有处理与文档关联的窗口/全局时才有用? – 2012-02-07 20:50:58

+1

不一定 - 正如我所说的,你可以有几个不同的文档(iframe),所以它是一个指向特定窗口的链接(例如'iframe.contentWindow' vs'window' vs'iframe2.contentWindow')。文档也可以移动,所以即使您存储了原始链接,它也可以更改。我相信,这是一种安全的方式来从'document'引用'当前窗口'。 – 2012-02-07 20:52:43

+0

你是对的。用一个新的提案来更新问题,以了解函数的外观。 – 2012-02-07 20:57:35

3

就我所知,这只是一个抽象,以防万一用户代理弹出DOM实现,但不提供窗口形式的视图。见Views在DOM级别2

+0

我不相信任何这样的UA存在? – 2012-02-07 20:48:45

+1

DOM 2视图已过时。 'defaultView'属性现在在HTML标准中定义。 – 2012-02-07 20:49:20

+0

@ŠimeVidas:有趣。看起来他们完全将它从DOM 3中移出并转换为HTML。不过,我现在很难浏览whatwg.org,可否提供链接? :| – BoltClock 2012-02-07 20:53:50

2

根据MDN getComputedStyle article

在许多代码示例在线,getComputedStyledocument.defaultView对象使用。

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

这是有可能的 默认视图模式是不希望写窗口和规范

  • 使得这也是在Java中使用的API

    1. 人的某种组合。

    但是,a single case其中defaultView的方法 必须使用:使用Firefox 3.6时访问镜框款式。

  • +3

    'defaultView'是有用的,因为你可以做'someElement.ownerDocument.defaultView'如果元素来自另一个文档/窗口,如框架或“window.open”或其他内容,它仍然可以工作。你看到漂浮的常见例子似乎错过了这一点。在我想出来之后,我试着回过头来解释这个问题。 – 2014-05-13 17:52:28

    +0

    @DaggNabbit正如MDN文章所说,这仅仅适用于Firefox 3.6。现在你可以使用'window',它也可以工作:[** Demo **](http:// jsfiddle。net/WQYbL /) – Oriol 2014-05-13 18:47:31

    +0

    真正让我对PPK和DM的例子感到困惑的是,他们使用'defaultView'的方式相当于使用'window',因为他们只是使用全局'document'属性而不是与文档关联的文档元素,所以它没有做任何有用的反正AFAICT。 – 2014-05-13 19:22:55

    3

    该操作系统询问“document.defaultView的含义是什么”这个问题,答案实际上与getComputedStyle没有任何关系。 document.defaultView属性只是一种获取window对象的方法,前提是该对象具有对该window中包含的document对象的引用。有些情况下,您正在寻求引用的window对象(或defaultView)与您正在运行的代码不在相同的窗口范围内。

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

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

    或者,如Dagg Nabbit指出,如果在任何情况下,你必须在窗口内的元素的引用,您可以通过element.ownerDocument.defaultView