2010-08-28 3 views
6

Disons que j'ai une référence à un objet document, qui est contenu dans un IFRAME. Comment obtenir une référence au conteneur IFRAME? .parentNode et .ownerDocument renvoient tous les deux une valeur nulle.Obtention d'une référence au parent IFRAME

Veuillez noter qu'aucune information de contexte n'est disponible (par exemple, des solutions comme 'window.xxx' ne fonctionneront pas) - tout ce qui est disponible est une référence à l'objet document.

Merci

+0

Que voulez-vous dire par « référence à un objet document »? Quel est le conteneur IFRAME? S'il vous plaît clarifier et peut-être montrer du code –

+0

J'ai la référence à un objet de script HTMLDocument (dans l'environnement de script Firefox), et aucune référence à son conteneur IFrame. – Melllvar

Répondre

11

Un document n'est pas directement connecté à son document parent. Vous avez besoin d'une référence à window afin de prendre le parent. La propriété DOM niveau 2 vues document.defaultView vous donnera le window dans la plupart des navigateurs Web modernes, mais dans IE, vous devez utiliser le non standard document.parentWindow à la place. (Certains navigateurs plus anciens ou plus obscurs n'implémentent aucune de ces propriétés, auquel cas vous êtes bloqué.)

Cela vous donnera le window du document parent. Si vous voulez obtenir le qui contient votre document, vous devrez parcourir toutes les iframes de la page et vérifier si le document que vous avez contient est vous-même.

Encore une fois, la méthode pour obtenir à partir d'un élément iframe retour à l'enfant est différent dans IE à titre gratuit (iframe.contentWindow vous donnant la window) vs la norme DOM et tout le monde (iframe.contentDocument vous donnant la document).

Donc, quelque chose comme: (. Le try... est d'éviter de s'écraser la boucle quand un accès aux documents échoue en raison d'un autre iframe étant sur un domaine différent, ce qui provoque une erreur même politique d'origine)

function getFrameForDocument(document) { 
    var w= document.defaultView || document.parentWindow; 
    var frames= w.parent.document.getElementsByTagName('iframe'); 
    for (var i= frames.length; i-->0;) { 
     var frame= frames[i]; 
     try { 
      var d= frame.contentDocument || frame.contentWindow.document; 
      if (d===document) 
       return frame; 
     } catch(e) {} 
    } 
} 

+0

Réponse parfaite; Merci! – Melllvar

+0

Bon travail comme d'habitude. –

1

J'utilise ceci:

function get_container_iframe() 
     {var rtn_iframe=null; 
      var iframes=window.parent.document.getElementsByTagName('iframe'); 
      for (var i=0; i<iframes.length; ++i) 
       {try 
        {var d=iframes[i].contentDocument || iframes[i].contentWindow.document || iframes[i].document; //ie | firefox etc | ie5 
        if (d===window.document) 
         {rtn_iframe=iframes[i]; 
         break; 
         } 
        } 
       catch(e) {} 
       } 
      return rtn_iframe; 
     } 
Questions connexes