web-dev-qa-db-ja.com

DocumentオブジェクトからWindowオブジェクトを取得するにはどうすればよいですか?

window.documentしかし、どうすればdocument.window?すべてのブラウザでこれを行う方法を知る必要があります。

55
Joren

document.defaultView IE 9。

101
kennebec

クロスブラウザーソリューションは複雑です。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)

18
Bill Keese

まあ、これは私が一緒に行ったソリューションです。それは機能しますが、私はそれが嫌いです。

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

@angular/platform-browserからDOCUMENTトークンを挿入することを選択しました。

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

そして、親にアクセスします:

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

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

最初に明確にしましょう。この種のことは、フレーム、iframe、および複数のウィンドウで作業している場合に必要になることがよくあります。そのため、ハンドルがすべてドキュメント(あなたがいるウィンドウとは別のウィンドウ.

第二に、残念ながら、ウィンドウオブジェクトに到達するdirect方法はありません。間接的な方法があります。

使用する主なメカニズムはwindow.nameです。親ウィンドウからウィンドウまたはフレームを作成する場合、通常は一意の名前を付けることができます。そのウィンドウ内のスクリプトはすべてwindow.nameで取得できます。ウィンドウ外のスクリプトは、そのすべての子ウィンドウのwindow.nameで取得できます。

それよりも具体的にするには、特定の状況に関する詳細情報が必要です。ただし、子スクリプトが親スクリプトと通信できる状況、またはその逆の場合は、常に名前でお互いを識別できます。通常はこれで十分です。

0
Breton