How do I get the Window object from the Document o

2019-02-07 16:11发布

问题:

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

回答1:

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
}


回答2:

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



回答3:

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)



回答4:

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


回答5:

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


回答6:

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.