2009-09-08 10 views
9

Czy jest możliwe dodanie detektora zdarzeń do elementu iframe? Próbowałem ten kod, ale nie wydaje się działać:Dodawanie detektora zdarzeń do ramki iframe

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

Ja również właśnie starał się za pomocą elementu o id i dodanie mojego słuchacza poprzez ramach JavaScript używam, jak to :

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

Potrafię wywoływać funkcje w elemencie iframe, więc nie sądzę, że bezpieczeństwo jest problemem. Jakieś pomysły?

+0

Co dokładnie wywołuje zdarzenie "afterLayout"? – kangax

Odpowiedz

2

Przyczyny awarii może być: -

  1. URL, do którego ramka zostanie skierowany z innej domeny, do zbiornika, a tym samym kod zapobiega scenariusz między domenami blokowania.
  2. Kod jest uruchomiony przed zawartością ramki jest ładowany
+0

1) Ta sama domena. 2) Próbujesz dołączyć w zdarzeniu onReady, aby zawartość ramki była gotowa. Właśnie zdałem sobie sprawę, że z powodzeniem załączam detektor zdarzeń do ładowania do elementu iframe, więc teraz nie jestem pewien, dlaczego "afterLayout" nie działa. Może to kwestia ramowa. – Ronald

+0

Myślę, że "ładowanie" jest jednym z niewielu wydarzeń, które można wcześnie nasłuchiwać - prawie z definicji, ponieważ nie można poprawnie czekać, aż załadowanie zostanie wykonane bez wcześniejszego załączenia "load" detektora! Zauważyłem, że jeśli programujesz programowo zawartość iframe (np. Przez 'srcdoc'), zawsze musisz poczekać na zdarzenie" load "(lub jQuery' load() ') przed podłączeniem innych detektorów zdarzeń. – peterflynn

4

Jeśli robisz poważne prace iframe w Ext, należy zajrzeć do rozszerzenia użytkownika ManagedIFrame:

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

To funkcjami wbudowanymi -w wydarzeniach i wiadomościach międzyramkowych, a także wielu innych korzyściach.

+0

Ja też bym to zrobił. –

11

nigdy nie próbował obsłużyć zdarzenie „afterLayout”, ale dla bardziej przeglądarki kodu kompatybilnego będziesz używać (iframe.contentWindow || iframe.contentDocument) zamiast iframe.contentWindow.

spróbować czegoś jak

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

nadzieję, że to pomoże.

+0

to nie działa dla mnie! nic nie drukuje w mojej konsoli! : / – Ciwan

Powiązane problemy