2010-08-28 11 views
6

Powiedz, że mam odwołanie do obiektu dokumentu, który jest zawarty w ramce IFRAME. Jak uzyskać odniesienie do kontenera IFRAME? .parentNode i .ownerDocument zwracają wartość null.Uzyskiwanie odniesienia do obiektu nadrzędnego IFRAME

Należy pamiętać, że nie są dostępne żadne informacje kontekstowe (np. Rozwiązania takie jak "window.xxx" nie będą działać) - wszystko, co jest dostępne, jest odniesieniem do obiektu dokumentu.

Dzięki

+0

Co masz na myśli przez „odniesienia do obiektu dokumentu”? Czym jest kontener IFRAME? Proszę wyjaśnić i może pokazać kod –

+0

Mam referencję do obiektu skryptowego HTMLDocument (w środowisku skryptowym Firefox) i bez odniesienia do jego ramki IFrame. – Melllvar

Odpowiedz

11

Dokument nie jest bezpośrednio powiązany z jego dokumentem nadrzędnym. Aby odebrać parent, konieczne jest podanie odniesienia do numeru window.

DOM Level 2 Odwiedzin nieruchomość document.defaultView daje window w większości nowoczesnych przeglądarek internetowych, ale w IE trzeba użyć niestandardowych document.parentWindow zamiast. (Niektóre starsze lub bardziej niezrozumiałe przeglądarki nie implementują żadnej z tych właściwości, w takim przypadku utkniesz.)

To da ci window dokumentu nadrzędnego. Jeśli chcesz uzyskać numer przechowujący dokument, będziesz musiał przejrzeć wszystkie elementy iframe na stronie i sprawdzić, czy dokument jest sam.

Ponownie, sposób dostać się z elementu iframe z powrotem do dziecka jest nieodpłatnie różne w IE (iframe.contentWindow daje window) vs standardu DOM i inni (iframe.contentDocument daje document).

Tak, coś takiego: (. Na try... jest uniknięcie awarii pętli się, kiedy dostęp dokument nie ze względu na inny iframe będąc w innej domenie, powodując tym samym błąd Polityka Origin)

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

Doskonała odpowiedź; dzięki! – Melllvar

+0

Dobra robota jak zwykle. –

1

używam tego:

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; 
     } 
Powiązane problemy