2009-08-27 4 views
44

Je peux obtenir window.document mais comment puis-je obtenir document.window? J'ai besoin de savoir comment le faire dans tous les navigateurs.Comment obtenir l'objet Window à partir de l'objet Document?

+2

Oserais-je demander pourquoi? window est un objet toujours disponible et il n'y a toujours pas plus de 1 document dans une fenêtre, une relation 1-1 pour ainsi dire ... – Colin

+4

Parce que j'utilise un prototype sur plusieurs iframes, et les différentes méthodes Element se brisent dans IE ou Safari si l'élément est en quelque sorte prolongé dans le mauvais champ. J'ai révisé certaines choses pour résoudre ce problème dans le prototype, mais une partie du correctif me demande de trouver à quelle fenêtre appartient un élément. – Joren

+0

@Joren, veuillez considérer de changer pour la réponse acceptée. – kay

Répondre

-1

The Window object is the top level object in the JavaScript hierarchy, donc il suffit de se référer comme fenêtre

Edit: réponse originale avant Promote JS effort. JavaScript technologies overview sur Mozilla Developer Network indique:

Dans un environnement de navigateur, cet objet global est l'objet de fenêtre.

Edit 2: Après avoir lu le commentaire de l'auteur à sa question (et se downvotes), cela semble être lié à la fenêtre du document de l'iframe. Jetez un oeil à window.parent et window.top et peut-être les comparer pour inférer votre fenêtre de document.

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

Après 'open()', la nouvelle fenêtre 'window' est une autre' window' que 'opener'.Si vous recevez un 'document' (ou n'importe quel' Node') d'une fonction, vous pourriez avoir besoin de la fenêtre d'origine. (Wow c'est très vieux.) – Rudie

77

Vous pouvez aller avec document.defaultView si vous êtes sûr de sa fenêtre et son accord pour sauter les navigateurs Microsoft Internet Explorer 9. avant

+6

Oui. Rappelez-vous que selon les spécifications, 'document.defaultView' ne doit pas être le même objet que' window' (et, en fait, il est différent dans certains anciens clients, par exemple: Safari 2.x) – kangax

+0

Fonctionne bien pour les documents XUL dans Firefox aussi! merci :) – macguru2000

+1

doc.parentWindow || doc.defaultView, et il fonctionne dans l'ancien IE et Safari –

3

Eh bien, c'est la solution que je suis allé avec. 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; 
} 
+0

IE seulement je vois ... –

+0

Qu'est-ce que IE seulement à ce sujet? Semble fonctionner correctement dans FF \ Saf \ IE \ Chrome. Cependant, ce n'est pas nécessaire dans tout sauf IE, puisque les autres navigateurs étendent automatiquement les éléments dans la bonne portée. – Joren

17

Une solution cross navigateur est compliqué, voici comment il le fait dojo (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 

a ("ie") renvoie true pour IE (et false sinon)

0

d'abord soyons clairs. ce genre de chose est souvent nécessaire lorsque vous travaillez avec des cadres, iframes, et plusieurs fenêtres, et donc "la fenêtre est juste l'objet global" est une réponse insatisfaisante si tout ce que vous avez un handle est un document de une autre fenêtre deuxième, malheureusement, il n'y a pas direct de manière à obtenir à l'objet de la fenêtre. il y a des moyens indirects.

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

pour obtenir plus de détails que cela nécessite plus d'informations sur la situation spécifique. Cependant, dans toute situation où les scripts enfants peuvent communiquer avec des scripts parents ou vice versa, ils peuvent toujours s'identifier par leur nom, ce qui est généralement suffisant.

Questions connexes