2009-09-08 10 views
9

¿Es posible agregar un detector de eventos a un iframe? He probado este código, pero no parece funcionar:Agregar un detector de eventos a un iframe

document.getElementsByTagName('iframe')[0].contentWindow.window.document.body.addEventListener('afterLayout', function(){ 
       console.log('works'); 
      }); 

También acabo de conseguir intentado usar el elemento de identificación y la adición de mi oyente a través del marco de JavaScript que estoy usando, como este :

Ext.fly("iframeID").addListener('afterLayout', function(){ alert('test'); }); 

puedo llamar a funciones en el marco flotante, por lo que no creo que la seguridad es un problema. ¿Algunas ideas?

+0

¿Qué dispara exactamente el evento "afterLayout"? – kangax

Respuesta

2

Las razones del fracaso podrían ser: -

  1. La URL a la que se dirige el iframe de un dominio diferente como el contenedor, por lo tanto, el código se evita mediante el bloqueo de secuencia de comandos entre dominios.
  2. El código se ejecuta antes de que el contenido de la trama se carga
+0

1) Mismo dominio. 2) Intentar adjuntar en un evento onReady, por lo que el contenido del marco debe estar listo. Me acabo de dar cuenta de que conecté con éxito un detector de eventos para cargarlo en el iframe, así que ahora no estoy seguro de por qué 'afterLayout' no está funcionando. Tal vez es un problema de marco. – Ronald

+0

Creo que "cargar" es uno de los pocos eventos que puede escuchar antes de tiempo, casi por definición, ya que no puede esperar correctamente hasta que se haya completado la carga sin antes haber agregado un oyente de "carga". Descubrí que si escribe los contenidos del iframe de forma programática (por ejemplo, a través de 'srcdoc') siempre debe esperar el evento" cargar "(o jQuery' load() ') antes de adjuntar otros eventos. – peterflynn

4

Si usted está haciendo el trabajo iframe grave en Ext, usted debe buscar en la extensión del usuario ManagedIFrame:

http://www.extjs.com/forum/showthread.php?t=40961

Se Características del edificio -en eventos y mensajería cross-frame, así como muchos otros beneficios.

+0

Yo también iría con esto. –

11

Nunca intenté manejar el evento 'afterLayout', pero para obtener más código compatible con el navegador usará (iframe.contentWindow || iframe.contentDocument) en lugar de iframe.contentWindow.

intentar algo así como

var iframe = document.getElementsByTagName('iframe')[0], 
    iDoc = iframe.contentWindow  // sometimes glamorous naming of variable 
     || iframe.contentDocument; // makes your code working :) 
if (iDoc.document) { 
    iDoc = iDoc.document; 
    iDoc.body.addEventListener('afterLayout', function(){ 
         console.log('works'); 
       }); 
}; 

Esperamos que va a ayudar.

+0

esto no funciona para mí! ¡nada se imprime en mi consola! : / – Ciwan

Cuestiones relacionadas