web-dev-qa-db-fra.com

Comment puis-je obtenir l'objet Window à partir de l'objet Document?

Je peux obtenir window.document mais comment puis-je obtenir document.window? J'ai besoin de savoir comment faire cela dans tous les navigateurs.

55
Joren

Vous pouvez aller avec document.defaultView si vous êtes sûr que c'est une fenêtre et que vous pouvez ignorer les navigateurs Microsoft avant IE 9.

101
kennebec

Une solution multi-navigateur est compliquée, voici comment dojo le fait (à partir de 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") renvoie true pour IE (et false sinon)

18
Bill Keese

Eh bien, c'est la solution que j'ai choisie. Cela fonctionne, mais je déteste ça.

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

J'ai choisi d'injecter le jeton DOCUMENT de @angular/platform-browser:

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

puis accédez au parent:

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

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

tout d'abord, soyons clairs. ce genre de chose est souvent nécessaire lorsque vous travaillez avec des cadres, des iframes et plusieurs fenêtres, et donc "la fenêtre n'est que l'objet global" est une réponse insatisfaisante si tout ce que vous avez à gérer est un document de ne autre fenêtre que celle dans laquelle vous vous trouvez.

deuxièmement, il n'y a malheureusement pas direct moyen d'accéder à l'objet window. il existe des moyens indirects.

le mécanisme principal à utiliser est window.name. lorsque vous créez une fenêtre ou un cadre à partir d'une fenêtre parent, vous pouvez généralement lui donner un nom unique. tous les scripts à l'intérieur de cette fenêtre peuvent obtenir à window.name. tous les scripts en dehors de la fenêtre peuvent accéder au window.name de toutes ses fenêtres enfants.

pour être plus précis que cela, il faut plus d'informations sur la situation spécifique. cependant, dans toute situation où les scripts enfants peuvent communiquer avec les scripts parents ou vice versa, ils peuvent toujours s'identifier par leur nom, ce qui est généralement suffisant.

0
Breton