Я могу получить window.document
но как я могу получить document.window
? Мне нужно знать, как это сделать во всех браузерах.
Как получить объект Window из объекта Document?
Ответ 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 всех его дочерних окон.
чтобы получить более конкретную информацию, требующую больше информации о конкретной ситуации. однако в любой ситуации, когда дочерние скрипты могут связываться с родительскими скриптами или наоборот, они всегда могут идентифицировать друг друга по имени, и этого обычно достаточно.