2010-08-28 17 views
6

Digamos que tengo una referencia a un objeto de documento, que está contenido dentro de un IFRAME. ¿Cómo obtengo una referencia al contenedor IFRAME? .parentNode y .ownerDocument ambos devuelven null.Obtener una referencia al padre IFRAME

Tenga en cuenta que no hay información de contexto disponible (por ejemplo, soluciones como 'window.xxx' no funcionarán): todo lo que está disponible es una referencia al objeto del documento.

Gracias

+0

¿Qué quiere decir por "referencia a un objeto de documento"? ¿Cuál es el contenedor IFRAME? Por favor, aclare y quizás muestre algún código –

+0

Tengo la referencia a un objeto de scripting HTMLDocument (en el entorno de scripting Firefox), y no hay referencia a su contenedor IFrame. – Melllvar

Respuesta

11

Un documento no está directamente conectado a su documento principal. Sí necesita una referencia al window para recoger el parent.

La propiedad de Views DOM Level 2 document.defaultView le dará el window en la mayoría de los navegadores web modernos, pero en IE tiene que usar el no estándar document.parentWindow en su lugar. (Algunos navegadores antiguos o más oscuros no implementan ninguna de estas propiedades, en cuyo caso le pegan.)

que usted va a dar al window del documento de nivel superior. Si desea obtener el que contiene su documento, tendrá que recorrer todos los iframes en la página y verificar si el documento contenido es suyo.

Una vez más, el método para llegar de un elemento iframe con el niño sepa es diferente en IE (iframe.contentWindow que le da la window) vs el estándar DOM y todos los demás (iframe.contentDocument que le da la document).

Por lo tanto, algo así como: (. El try... es evitar estrellarse el bucle cuando un acceso a los documentos falla debido a otro iframe estar en un dominio diferente, causando un error de política del mismo origen)

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

Respuesta perfecta; ¡Gracias! – Melllvar

+0

Buen trabajo como de costumbre. –

1

utilizo este:

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; 
     } 
Cuestiones relacionadas