2009-06-15 20 views
0

我有一個帶有嵌入式IFRAME的HTML頁面(父級)。父頁面有鼠標和鍵盤事件的兩個事件監聽器,如下所示(我正在使用Prototype庫)。如何讓IFRAME收聽與父母相同的事件(並激發相同的處理程序)

var IdleMonitor = Class.create({ 

    active: null, 
    initialize: function(ii) { 
     Element.observe(window, "mousemove", this.sendActiveSignal.bind(this)); 
    }, 

    sendActiveSignal: function() { 
     console.log("MOUSE"); 
    } 
}); 

var idleMonitor = new IdleMonitor(); 

IFRAME作爲一個單獨的文檔和所有文檔不會響應父代的事件。所以我已經設置了一些代碼在IFRAME這樣的:

<script type="text/javascript" > 

     Element.observe(window, "mousemove", function(p) { 
      parent.sendActiveSignal(); 

     }); 
</script> 

但是,這給了我一個錯誤(sendActiveSignal是未定義功能)。 我該如何讓IFRAME監聽相同的事件並激發父母的事件處理程序,最好以Prototype-y方式?

回答

2

首先,我真的認爲你應該使用bindAsEventListener作爲事件監聽器的綁定函數。通過這樣做,您可以訪問事件的參數。您稍後可能需要它。

在你的情況下,我注意到的第一件事是你的sendActiveSignal被聲明爲你的IdleMonitor類的成員。如果您只是通過parent.sendActiveSignal調用它,JS引擎就不會找到它,因爲我猜測父代不是IdleMonitor實例。 (而且這還不是,我現在可以告訴它:])

裏面的iframe中,你必須訪問idleMonitor變量,你可以做到這一點通過引用這樣說:

<script type="text/javascript"> 
Element.observe(window, "mousemove", function(p) { parent.document.idleMonitor.sendActiveSignal(); }); 
</script> 

這幾乎應該工作,我現在不能測試它。

+0

點上bindAsEventListenter()採取...感謝 但是,功能仍然不確定;一定是因爲它在那個班上? – yalestar 2009-06-16 00:03:21

+0

當我回家時,我會調試它,但是如果你得到idleMonitor成員的權利(不是空的實例或未定義的值),問題可能在於原型如何創建類(函數)。我在框架和彈出窗口之間做了一些工作,它們工作得很好......我不得不實施一些'魔術'來使原型對象工作。 – wtaniguchi 2009-06-16 21:03:07

0

原來,使用iframe元素的contentDocument屬性從父級訪問子iframe要容易得多,例如,

document.observe("dom:loaded", function() { 

    Element.observe($('id-of-iframe').contentDocument, "mousemove", function() { 
     // call whatever... 
    }); 
}); 
相關問題