簡體   English   中英

document.defaultView有什么意義?

[英]What's the point of document.defaultView?

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;
}

像這樣的代碼可以在其他地方找到,比如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.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。 我認為這可能是首選。 這將獲取包含節點的文檔以及與之關聯的窗口。 如果ownerDocumentdefaultView被破壞,它會回getComputedStyle當前窗口的getComputedStyle (我getComputedStyle記得getComputedStyledefaultView之前出現)。 這可能更接近defaultView的預期用途。

我對此並不樂觀,但我認為這是修復一個錯誤的結果,試圖在分離的文檔上運行代碼(即存在於內存中但不在頁面中的內容)或嘗試在文檔上運行在不同的窗口(例如iframe或彈出窗口)。

根據您的引用,當document.defaultView在不是當前文檔的document.defaultView上運行時,您將獲得關聯的窗口對象,因此document.documentView.getComputedStyle !== getComputedStyle因為它們位於不同的上下文中。

簡而言之,我認為它類似於不存在的document.window

OP問了一個問題,“ document.defaultView有什么意義”,答案真的與getComputedStyle沒有任何關系。 document.defaultView屬性只是獲取window對象的一種方法,如果有一個window對象包含該window包含的document對象。 在某些情況下,您要引用的window對象(或defaultView )與您運行的代碼不在同一窗口范圍內。

這方面的一個示例是,如果您在iframe中引用了document對象,並希望方便地獲取對該iframe的window對象的引用。

另一種情況可能是您在瀏覽器范圍中的特權上下文中運行的位置(例如,Firefox中的chrome代碼),並且您碰巧引用了tabbrowser或其他窗口的document對象。

或者,正如Dagg Nabbit指出的那樣,如果在任何這些情況下你有一個對窗口內元素的引用,你可以通過element.ownerDocument.defaultView訪問該元素的父window element.ownerDocument.defaultView

就我所知,它只是一個抽象,以防任何用戶代理彈出DOM實現,但不提供窗口形式的視圖。 請參閱DOM級別2中的視圖

根據MDN getComputedStyle文章

在許多在線代碼示例中, getComputedStyle用於document.defaultView對象。

幾乎在所有情況下,這都是不必要的,因為getComputedStyle存在於window對象上。

它可能是defaultView模式的某種組合

  1. 人們不想為窗口編寫規范
  2. 制作一個也可以在Java中使用的API。

但是,有一種情況是必須使用defaultView的方法:使用Firefox 3.6訪問框架樣式時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM