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

Как получить объект Window из объекта Document?

Я могу получить window.document но как я могу получить document.window? Мне нужно знать, как это сделать во всех браузерах.

4b9b3361

Ответ 1

Объект Window - это объект верхнего уровня в иерархии JavaScript, поэтому просто обратитесь к нему как к окну

Edit: Оригинальный ответ перед Продвинуть JS. Обзор технологий JavaScript в Mozilla Developer Network говорит:

В среде браузера этот глобальный объект является объектом окна.

Изменить 2: Прочитав комментарий автора к его вопросу (и получив downvotes), это, похоже, связано с окном документа iframe. Взгляните на window.parent и window.top и, возможно, сравнить их с тем, чтобы вывести окно вашего документа.

if (window.parent != window.top) {
  // we're deeper than one down
}

Ответ 2

Вы можете пойти с document.defaultView, если вы уверены, что его окно и все в порядке, чтобы пропустить браузеры Microsoft до IE 9.

Ответ 3

Решение с перекрестным браузером сложно, вот как это делает dojo (из window.js:: get()):

// In some IE versions (at least 6.0), document.parentWindow does not return a
// reference to the real window object (maybe a copy), so we must fix it as well
// We use IE specific execScript to attach the real window reference to
// document._parentWindow for later use
if(has("ie") && window !== document.parentWindow){
    /*
    In IE 6, only the variable "window" can be used to connect events (others
    may be only copies).
    */
    doc.parentWindow.execScript("document._parentWindow = window;", "Javascript");
    //to prevent memory leak, unset it after use
    //another possibility is to add an onUnload handler which seems overkill to me (liucougar)
    var win = doc._parentWindow;
    doc._parentWindow = null;
    return win; //  Window
}

return doc.parentWindow || doc.defaultView; //  Window

имеет ( "ie" ) возвращает true для IE (и false в противном случае)

Ответ 4

Ну, это решение, с которым я пошел. Он работает, но я его ненавижу.

getScope : function(element) {
    var iframes = top.$$('iframe');
    var iframe = iframes.find(function(element, i) {
        return top[i.id] ? top[i.id].document == element.ownerDocument : false;
    }.bind(this, element));
    return iframe ? top[iframe.id] : top;
}   

Ответ 5

Я решил добавить токен DOCUMENT из @angular/platform-browser:

import { DOCUMENT } from '@angular/platform-browser'

а затем получить доступ к родителю:

constructor(@Inject(DOCUMENT) private document: any) {
}

public ngOnInit() {
  // this.document.defaultView || this.document.parentWindow;
}

Ответ 6

сначала дайте понять. это часто необходимо, когда вы работаете с фреймами, iframes и несколькими окнами, и поэтому "окно является всего лишь глобальным объектом" является неудовлетворительным ответом, если все, что у вас есть дескриптор, - это документ из другого окна, один, в котором вы находитесь.

second, к сожалению, нет прямого способа получить объект окна. есть косвенные пути.

основным механизмом для использования является window.name. при создании окна или кадра из какого-либо родительского окна вы обычно можете дать ему уникальное имя. любые скрипты внутри этого окна могут попасть в window.name. любые скрипты вне окна могут попасть в window.name всех его дочерних окон.

чтобы получить более конкретную информацию, требующую больше информации о конкретной ситуации. однако в любой ситуации, когда дочерние скрипты могут связываться с родительскими скриптами или наоборот, они всегда могут идентифицировать друг друга по имени, и этого обычно достаточно.