2011-07-14 9 views
3

ページが読み込まれるたびに自動的にjavascriptコードを実行するモバイルFirefoxのプラグインを作成しようとしています。私はFennecの以前のバージョン用にいくつかのコードを書いていましたが、新しいFennecバージョン(https://wiki.mozilla.org/Mobile/Fennec/Extensions/Electrolysis/)のマルチプロセッシングシステムでは、このコードは移植されました。私はhttp://people.mozilla.com/~mfinkle/tutorials/からのチュートリアルに基づいて、ブラウザメニューでオプションが選択されたときにコードの一部を実行するバージョンの動作を得ました。この解決策は、overlay.js(メイン(アプリケーション)プロセス用)とcontent.js(チャイルド(コンテンツ)プロセス用)の2つの部分で構成されています。 content.js新しいタブのためにロードされている間Overlay.jsはoverlay.jsに次のコードを介して、overlay.xulにロードされる:モバイル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); 

最後のステートメントは効果がありません。この文は、このメッセージのために、それに応答して、リスナーを登録overlay.jsスクリプトへのメッセージ、単にオプションと同じメッセージが送信を送信

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

:その後、私は最後に次のステートメントを追加してみましたブラウザメニューの "coin:addCoin"をクリックします。しかし、これはうまくいかなかった。最後に、overlay.jsスクリプトが(「tabOpened」などのような)リッスンできるイベントを探してみましたが、何も見つかりませんでした。

ページの読み込みごとに自動的にコードを実行する方法はありますか?

よろしく、

ウィリアム

答えて

3

あなたは単にあなたが古い単一プロセスのFirefoxを持っているのと同じように、「ロード」イベントのイベントリスナーを登録することができ、あなたのcontent.jsスクリプトで:

addEventListener("load", someFunc, true); 

これは、タブにウェブページが読み込まれるたびに「someFunc」を呼び出します。

ページが読み込まれたときではなく、タブが最初に作成されたときにcontent.js内のグローバルコードが実行されます。グローバルコードを使用して、イベントリスナーまたはメッセージリスナーを設定します。 Webコンテンツは引き続きcontent.js(子スクリプト)で捕捉可能なイベントを発生させます。

+0

こんにちはマーク、あなたの迅速な応答に感謝(とあなたのチュートリアルに!:)。 addEventListener( "load"と "DOMContentLoaded"を使用)を試してから、コンテンツ、content.document、content.windowRootなどのコンテンツをプリペンドしてみたところ、私はcontent.jsで同様のことを試していました。何らかの理由で、 「真の」パラメータ(理由は不明)。それで、今、うまくいっています! –

+0

content.addEventListener(...)はいくつかのイベントで機能しますが、 "content"オブジェクトが有効なときにイベントリスナーを設定し、リッスンしたいイベントをまだ開始していません。 "content"はWebページのDOMウィンドウなので、新しいページがロードされると変更されます。addEventListenerのグローバルオブジェクトを使用すると、リスナーは常に使用可能であり、「true」を使用すると、イベントがキャプチャされたことを意味します。既にバブルなので、すべてのDOMイベントが「true」を必要とするわけではありません。 –

+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 ... 
} 
関連する問題