javascript 如何从Document对象获取Window对象?

sirbozc5  于 2023-04-19  发布在  Java
关注(0)|答案(6)|浏览(300)

我可以得到window.document,但我如何才能得到document.window?我需要知道如何在所有浏览器中做到这一点。

jum4pzuy

jum4pzuy1#

如果你确定document.defaultView是一个窗口,并且可以跳过IE9之前的微软浏览器,你可以选择document.defaultView

s4chpxco

s4chpxco2#

跨浏览器的解决方案是复杂的,下面是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

has(“ie”)对于IE返回true(否则返回false)

vxf3dgd4

vxf3dgd43#

这是我的解决方案,很有效,但我讨厌它。

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;
}
sg3maiej

sg3maiej4#

我选择从@angular/platform-browser注入DOCUMENT令牌:

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

然后访问父节点:

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

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

j2cgzkjk5#

首先,让我们明确一下。当你使用框架,iframe和多个窗口时,这种事情通常是必要的,所以如果你所拥有的句柄是来自 * 另一个窗口 * 的文档,而不是你所在的窗口,那么“窗口只是全局对象”是一个不令人满意的答案。
第二,不幸的是,没有直接的方法来获取窗口对象。有间接的方法。
使用的主要机制是window.name。当从某个父窗口创建窗口或框架时,通常可以给予它一个唯一的名称。该窗口内的任何脚本都可以获取window.name。该窗口外的任何脚本都可以获取其所有子窗口的window.name。
要得到更具体的比这需要更多的信息,关于这一特定的情况.然而,在任何情况下,子脚本可以与父脚本通信,反之亦然,他们总是可以识别对方的名字,这通常是足够的.

pengsaosao

pengsaosao6#

The Window object is the top level object in the JavaScript hierarchy,因此将其称为窗口

**编辑:**原始答案之前Promote JS努力. JavaScript technologies overview在Mozilla开发者网络说:

在浏览器环境中,此全局对象是窗口对象。

**编辑2:**在阅读了作者对他的问题的评论(并获得了反对票)后,这似乎与iframe的文档窗口有关。看看window.parentwindow.top,也许可以比较它们来推断您的文档窗口。

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

相关问题