2009-09-08 11 views
9

Est-il possible d'ajouter un écouteur d'événement à un iframe? J'ai essayé ce code, mais il ne semble pas fonctionner:Ajout d'un écouteur d'événement à un iframe

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

J'ai aussi juste essayé d'utiliser obtenir l'élément par identifiant et en ajoutant mon auditeur via le framework JavaScript J'utilise, comme celui-ci :

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

Je peux appeler des fonctions dans l'iframe, donc je ne pense pas que la sécurité soit un problème. Des idées?

+0

Qu'est-ce qui déclenche exactement l'événement "afterLayout"? – kangax

Répondre

2

Les raisons de l'échec peuvent être: -

  1. L'URL à laquelle le iframe est dirigé à partir d'un autre domaine que le récipient, d'où le code est empêchée par un script inter-domaines de blocage.
  2. Le code est en cours d'exécution avant que le contenu du cadre est chargé
+0

1) Même domaine. 2) Essayer de joindre un événement onReady, le contenu du cadre doit donc être prêt. Je viens de réaliser que j'ai attaché avec succès un écouteur d'événement pour le chargement de l'iframe, donc maintenant je ne sais pas vraiment pourquoi 'afterLayout' ne fonctionne pas. Peut-être que c'est un problème de cadre. – Ronald

+0

Je pense que "load" est l'un des rares événements que vous pouvez écouter tôt - presque par définition, puisque vous ne pouvez pas attendre que le chargement se fasse sans attacher un "load" listener plus tôt! J'ai trouvé que si vous écrivez le contenu iframe par programme (par exemple via 'srcdoc') vous devez toujours attendre l'événement" load "(ou jQuery' load() ') avant d'attacher d'autres écouteurs d'événements. – peterflynn

4

Si vous faites un travail sérieux iframe poste, vous devriez regarder dans l'extension de l'utilisateur ManagedIFrame:

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

Il dispose construit - dans les événements et les messages croisés, ainsi que de nombreux autres avantages.

+0

Je voudrais aussi aller avec ça. –

11

Je n'ai jamais essayé de gérer l'événement 'afterLayout' mais pour plus de code compatible avec le navigateur , vous utiliserez (iframe.contentWindow || iframe.contentDocument) au lieu de iframe.contentWindow.

essayer quelque chose comme

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'); 
       }); 
}; 

Espérons que ça vous aidera.

+0

cela ne fonctionne pas pour moi! rien ne s'imprime dans ma console! : / – Ciwan

Questions connexes