2009-09-08 166 views
9

是否可以將事件偵聽器添加到iframe?我試過這個代碼,但它似乎並沒有工作:將事件偵聽器添加到iframe

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

我也只是使用ID獲取元素,並通過JavaScript框架我用我的添加監聽器,這樣的嘗試:

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

我可以調用在iframe的功能,所以我不認爲安全是一個問題。有任何想法嗎?

+0

究竟發生了什麼「afterLayout」事件? – kangax 2009-09-09 05:29:16

回答

2

失敗原因可能是: -

  1. 將所述iFrame是從一個不同的域作爲容器定向的URL,因此碼通過跨域腳本阻止防止。
  2. 的代碼框架內容運行前加載
+0

1)同域。 2)嘗試附加onReady事件,所以框架內容應該準備好。只是意識到我成功地附加了一個事件監聽器來加載到iframe,所以現在我真的不知道爲什麼'afterLayout'不工作。也許這是一個框架問題。 – Ronald 2009-09-08 14:26:25

+0

我認爲「負載」是您可以儘早收聽的少數事件之一 - 幾乎可以定義,因爲您無法等到加載完成之前不加載「負載」偵聽器!我發現如果以編程方式編寫iframe內容(例如通過'srcdoc'),則在附加其他事件偵聽器之前,您必須等待「load」事件(或jQuery load())。 – peterflynn 2014-01-14 09:30:42

4

如果你正在做的內線嚴重的iframe的工作,你應該看看ManagedIFrame用戶分機:

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

它具有內置在事件和跨幀消息,以及許多其他好處。

+0

我也會這樣。 – 2009-09-20 01:39:20

11

我從來沒有試過處理'afterLayout'事件,但對於更多瀏覽器兼容代碼 ,您將使用(iframe.contentWindow || iframe.contentDocument)而不是iframe.contentWindow

嘗試像

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

希望能對大家有所幫助。

+0

這不適合我!沒有東西在我的控制檯打印出來:/ – Ciwan 2015-06-05 13:16:56

相關問題