Какой смысл 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. Я не уверен, что люди просто копируют из ППК или какого-то другого источника или придумывают это самостоятельно, но я этого не понимаю.
Мой вопрос: в чем смысл использования 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;
}
Сам элемент должен быть передан, а не идентификатор. Я думаю, что это, вероятно, все равно будет предпочтительным. Это получает документ, содержащий node и связанное с ним окно. Он имеет откат к текущему окну getComputedStyle
, если ownerDocument
или defaultView
сломаны (я смутно помню, что getComputedStyle
был вокруг до defaultView
). Вероятно, это ближе к предполагаемому использованию defaultView
.
Ответы
Ответ 1
Я не уверен в этом, но я полагаю, что это результат исправления ошибки или попытки запустить код в отдельном документе (т.е. что-то, что существует в памяти, но не находится на странице), или попытки запустить на документе в другом окне (например, iframe или всплывающее окно).
В соответствии с вашей цитатой, когда document.defaultView
выполняется в документе, который НЕ является текущим документом, вы получите связанный объект окна, таким образом document.documentView.getComputedStyle !== getComputedStyle
, поскольку они находятся в разных контекстах.
Короче говоря, я считаю, что это похоже на document.window
, которого не существует.
Ответ 2
Это просто абстракция, насколько я могу судить, на всякий случай, когда какие-либо пользовательские агенты появляются с реализацией DOM, но не предоставляют представление в виде окна. См. Views в DOM уровне 2.
Ответ 3
ОП задает вопрос "Что такое document.defaultView
", и ответ действительно не имеет никакого отношения к getComputedStyle. Свойство document.defaultView
- это просто способ получить объект window
, если у него есть ссылка на объект document
, содержащийся в этом window
. Существуют случаи, когда объект window
, который вы хотите ссылаться (или defaultView
), находится не в той же области окна, что и код, который вы используете.
Одним из примеров этого является то, что если у вас есть ссылка на объект document
в iframe и желательно получить ссылку на объект window
этого iframe.
Другим случаем может быть то, что вы работаете в привилегированном контексте в области браузера (например, хром-код в Firefox), и у вас есть ссылка на объект document
для tabbrowser или другого окна.
Или, как указывает Дагг Набитт, если в любом из этих случаев у вас есть ссылка на элемент внутри окна, вы можете получить доступ к родительскому window
этого элемента через element.ownerDocument.defaultView
Ответ 4
Согласно статья MDN getComputedStyle
,
Во многих образцах кода онлайн, getComputedStyle
используется из document.defaultView
объект.
Почти во всех случаях это бесполезно, поскольку getComputedStyle
существует и в объекте window
.
Вероятно, defaultView был некоторая комбинация
- люди, не желающие писать спецификацию для окна и
- создание API, который также можно использовать в Java.
Однако существует один случай, где метод defaultView
должны использоваться: при использовании Firefox 3.6 для доступа к стилям в рамке.