2012-02-07 103 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