2011-07-14 113 views
3

我正在嘗試編寫一個移動Firefox插件,每次加載頁面時都會自動執行一段JavaScript代碼。我已經爲早期版本的Fennec編寫了一些代碼,但是在更新的Fennec版本(https://wiki.mozilla.org/Mobile/Fennec/Extensions/Electrolysis/)中使用了多處理系統,該代碼必須是移植。我基於http://people.mozilla.com/~mfinkle/tutorials/的教程獲得了一個可以在瀏覽器菜單中選擇一個選項時執行一段代碼的版本。該解決方案由兩部分組成,即overlay.js(用於主(應用程序)進程)和content.js(用於子進程)。 overlay.js中通過下面的代碼加載在overlay.xul,而content.js被裝載新的選項卡在overlay.js中:移動Firefox(Fennec)附加組件:執行頁面加載代碼

window.messageManager.loadFrameScript("chrome://coin/content/content.js", true); 

在overlay.js中的代碼將消息發送到content.js每當點擊瀏覽器菜單中的選項,然後正確執行所需的代碼(某些腳本標記僅添加到頁面的頭部)。但是,我不知道如何在頁面加載時自動執行代碼。我在content.js中嘗試了以下內容:

function addCoin(aMessage) { ... } 

// this executes the desired code every time an option is clicked in the browser menu 
addMessageListener("coin:addCoin", addCoin); 

// this attempts to execute the code on every page load; i.e., after this script has  
been loaded for the new tab 
addCoin(null); 

但是最後一條語句沒有效果。然後,我試圖在最後加入以下語句:

sendAsyncMessage("coin:scriptLoaded", { }); 

該語句將消息發送到所述overlay.js中腳本,這對於該消息,並且響應寄存器收聽者簡單地發送相同的消息作爲當選項在瀏覽器菜單中單擊,即「coin:addCoin」。但是,這也不起作用。最後,我嘗試尋找overlay.js腳本可以偵聽的某些事件(如「tabOpened」或其他),但找不到任何東西。

有沒有人有關於如何在每個頁面加載自動執行代碼的任何想法?

問候,

威廉

回答

3

在你content.js腳本,你可以簡單地註冊一個事件偵聽器「load」事件,就像你會在老單進程的Firefox:

addEventListener("load", someFunc, true); 

這會在網頁加載到標籤頁時隨時調用「someFunc」。

content.js中的任何全局代碼在標籤初始創建時執行,而不是在頁面加載時執行。使用全局代碼來設置事件監聽器或消息監聽器。網頁內容仍會觸發您可以在content.js(子腳本)中捕獲的事件。

+0

您好馬克,感謝您的回覆迅速(和你的教程!:)。在發佈我的問題後,嘗試了content.js中的類似內容,嘗試addEventListener(使用「load」和「DOMContentLoaded」),然後預先考慮內容,content.document,content.windowRoot,..由於某些原因, 「真實」參數(不知道爲什麼)。所以,它現在起作用了,非常感謝! –

+0

content.addEventListener(...)適用於某些事件,但技巧是在「content」對象有效時設置事件偵聽器,並且尚未觸發您要偵聽的事件。 「內容」是網頁的DOM窗口,所以它會在新頁面加載時更改。將全局對象用於addEventListener意味着監聽器始終可用,並且使用「true」意味着事件被捕獲,即使它本身沒有冒泡。並非所有的DOM事件都需要「真實」,因爲它們已經泡沫化了。 –

+0

好吧,事情變得越來越清楚知道:)再次感謝。 –

1

這對我有效。

content.js

var addEventListener; 

if (window.BrowserApp) { // We are running in Mobile Firefox 
    addEventListener = window.BrowserApp.deck.addEventListener; 
} else { 
    var appcontent = document.getElementById("appcontent"); 
    if (appcontent) { 
     addEventListener = appcontent.addEventListener; 
    } 
} 

if (addEventListener) { 

    var onDOMContentLoaded = function() { /* Code here */ }; 
    addEventListener("DOMContentLoaded", onDOMContentLoaded, true); 

    var onLoad = function() { /* Code here */ }; 
    addEventListener("load", onLoad, true); 

    // etc ... 
}