[英]Javascript document.defaultView or document.styleSheets?
[英]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。 我認為這可能是首選。 這將獲取包含節點的文檔以及與之關聯的窗口。 如果ownerDocument
或defaultView
被破壞,它會回getComputedStyle
當前窗口的getComputedStyle
(我getComputedStyle
記得getComputedStyle
在defaultView
之前出現)。 這可能更接近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中的視圖 。
在許多在線代碼示例中,
getComputedStyle
用於document.defaultView
對象。幾乎在所有情況下,這都是不必要的,因為
getComputedStyle
存在於window
對象上。它可能是defaultView模式的某種組合
- 人們不想為窗口編寫規范
- 制作一個也可以在Java中使用的API。
但是,有一種情況是必須使用
defaultView
的方法:使用Firefox 3.6訪問框架樣式時。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.