Подтвердить что ты не робот

Какой смысл 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.

4b9b3361

Ответ 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 для доступа к стилям в рамке.