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

发布于 2024-08-02 13:30:37 字数 97 浏览 4 评论 0原文

我可以获取 window.document 但如何获取 document.window?我需要知道如何在所有浏览器中执行此操作。

I can get window.document but how can I get document.window? I need to know how to do this in all browsers.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

饮湿 2024-08-09 13:30:37

You can go with document.defaultView if you’re sure its a window and its okay to skip Microsoft browsers before IE 9.

相思碎 2024-08-09 13:30:37

跨浏览器解决方案很复杂,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)

A cross browser solution is complicated, here's how dojo does it (from 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") returns true for IE (and false otherwise)

情泪▽动烟 2024-08-09 13:30:37

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

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

Well, this is the solution I went with. It works, but I hate it.

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;
}   
瞳孔里扚悲伤 2024-08-09 13:30:37

我选择从 @angular/platform-b​​rowser 注入 DOCUMENT 令牌:

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

然后访问父级:

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

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

I opted to inject the DOCUMENT token from @angular/platform-browser:

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

and then access the parent:

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

public ngOnInit() {
  // this.document.defaultView || this.document.parentWindow;
}
回忆凄美了谁 2024-08-09 13:30:37

首先我们要明确一点。当您使用框架、iframe 和多个窗口时,这种事情通常是必要的,因此,如果您所处理的只是另一个文档,那么“窗口只是全局对象”是一个令人不满意的答案窗口比您所在的窗口要大。

第二,不幸的是没有直接方法来获取窗口对象。有间接的方法。

使用的主要机制是window.name。当从某个父窗口创建窗口或框架时,通常可以给它一个唯一的名称。该窗口内的任何脚本都可以获取 window.name。窗口外部的任何脚本都可以获取其所有子窗口的 window.name 。

要获得更具体的信息,需要更多有关具体情况的信息。然而,在任何情况下,子脚本可以与父脚本通信,反之亦然,它们总是可以通过名称来识别彼此,这通常就足够了。

first off let's be clear. this sort of thing is often necessary when you are working with frames, iframes, and multiple windows, and so "the window is just the global object" is an unsatisfying answer if all you have a handle to is a document from another window than the one you are in.

second, unfortunately there is no direct way of getting at the window object. there are indirect ways.

the primary mechanism to use is window.name. when creating a window or a frame from some parent window, you can usually give it a unique name. any scripts inside that window can get at window.name. any scripts outside the window can get at the window.name of all its child windows.

to get more specific than that requires more info about the specific situation. however in any situation where the child scripts can communicate with parent scripts or vice versa, they can always identify each other by name, and this is usually enough.

穿透光 2024-08-09 13:30:37

Window 对象是 JavaScript 层次结构中的顶级对象,因此只需引用它即可作为窗口

编辑:
推广 JS 工作之前的原始答案。 Mozilla 开发者网络上的 JavaScript 技术概述 说道:

在浏览器环境中,这个全局对象就是window对象。

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

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

The Window object is the top level object in the JavaScript hierarchy, so just refer to it as window

Edit:
Original answer before Promote JS effort. JavaScript technologies overview on Mozilla Developer Network says:

In a browser environment, this global object is the window object.

Edit 2:
After reading the author's comment to his question (and getting downvotes), this seems to be related to the iframe's document window. Take a look at window.parent and window.top and maybe compare them to infer your document window.

if (window.parent != window.top) {
  // we're deeper than one down
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文