2010-08-28 13 views
6

Dire che ho un riferimento a un oggetto documento, che è contenuto in un IFRAME. Come posso ottenere un riferimento al contenitore IFRAME? .parentNode e .ownerDocument restituiscono entrambi null.Ottenere un riferimento al genitore IFRAME

Si noti che non sono disponibili informazioni di contesto (ad esempio soluzioni come "window.xxx" non funzioneranno) - tutto ciò che è disponibile è un riferimento all'oggetto del documento.

Grazie

+0

Cosa si intende per "riferimento ad un oggetto documento"? Qual è il contenitore IFRAME? Si prega di chiarire e magari mostrare qualche codice –

+0

Ho il riferimento a un oggetto di script HTMLDocument (nell'ambiente di scripting di Firefox) e nessun riferimento al suo contenitore IFrame. – Melllvar

risposta

11

Un documento non è direttamente collegato al documento principale. Hai bisogno di un riferimento a window per raccogliere il parent.

Il DOM Level 2 Visualizzazioni proprietà document.defaultView vi darà la window nella maggior parte dei browser moderni, ma in IE è necessario utilizzare il non-standard document.parentWindow invece. (Alcuni browser più vecchi o più oscuri non implementano nessuna di queste proprietà, nel qual caso sei bloccato.)

Questo ti darà lo window del documento principale. Se vuoi ottenere lo che trattiene il tuo documento, dovrai scorrere tutti gli iframe sulla pagina e controllare se il documento contenuto è te stesso.

Anche in questo caso, il metodo per ottenere da un elemento iframe indietro al bambino è diverso gratuitamente in IE (iframe.contentWindow dandovi la window) contro lo standard DOM e tutti gli altri (iframe.contentDocument dandovi la document).

Quindi, qualcosa di simile a: (. La try... è per evitare di sbattere il ciclo quando un accesso documento non riesce a causa di un altro iframe essere su un dominio diverso, causando un errore stesso Origin Policy)

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

Risposta perfetta; Grazie! – Melllvar

+0

Buon lavoro come al solito. –

1

io uso questo:

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