2012-01-15 19 views
4

Firefoxのアドオンを開発しています。私がしたいのは、カスタムJavaScript関数を挿入することです。Firefoxの拡張機能を使用してすべてのWebページにJavaScript関数を挿入する方法

すなわち

function foo() {..} 

だから、すべてのページが最初にそれを定義せずにFOOを呼び出すことができます。

私は、次のような他の回答から見てい:http://groups.google.com/group/greasemonkey-users/browse_thread/thread/3d82a2e7322c3fce

をしかし、それは、Webページ上で変更する必要があります。もし私がおそらく関数fooをGoogle.comに注入したいのであれば?それは可能ですか?

私はそれをusercriptで行うことができますが、可能であれば拡張アプローチを使用したいと思います。

+2

greasemonkeyを試しましたか? – rook

+0

私は前にFirefoxのアドオンをビルドしていませんが、ウィンドウオブジェクトへのアクセス権があれば、ドキュメントの先頭にスクリプトを追加して呼び出しを行うことができます。私は、スクリプトがあなたのスクリプトを呼び出すためにそれらのスクリプトで利用可能であることを確信していませんが、それは価値があります。あなたは、sudoの文書準備呼び出しとなるコードに設定されたフラグを作成しなければならないかもしれません。 – Seth

+0

@Rook、greasemonkeyは機能しますが、多数のマシンへのより良い展開のための拡張機能を作成したいのです。私はgmがこれを行うことができるので、同じことをするためにいくつかのAPIを利用できるはずだと思います。 – Howard

答えて

1

ページ上でjavascript関数を使用して簡単なhrefを作成するとどうなりますか?
Like bookmarkletsが動作します。ここで

サンプルコードです:スクリプトのURLを入れて、

function(scriptUrl) { 

    var newScript = document.createElement('script'); 

    // the Math.random() part is for avoiding the cache 
    newScript.src = scriptUrl + '?dummy=' + Math.random(); 

    // append the new script to the dom 
    document.body.appendChild(newScript); 

    // execute your newly available function 
    window.foo(); 

}('[url of your online script]') 


それを使用します。
URLはformatedというコードの1行でなければなりませんが、コードの可読性のために私はformateしました。

私はFirefoxの拡張機能を開発したことはありませんが、私はどのようにロールバックするのでしょうか。

お役に立てば幸いです。

6

あなたの質問を読むときに私が最初に思ったのは、 "これは詐欺のように見える"ということでした。あなたは何を達成しようとしていますか?

とにかく、ここでa Jetpack (Add-on builder) add-on that injects a script in every page loadedです:

main.js:

const self = require("self"), 
     page_mod = require("page-mod"); 

exports.main = function() { 
    page_mod.PageMod({ 
     include: "*", 
     contentScriptWhen: "ready", 
     contentScriptFile: self.data.url("inject.js") 
    }); 
}; 

inject.js:

unsafeWindow.foo = function() { 
    alert('hi'); 
} 

unsafeWindow.foo(); 
+0

外部サイトへのリンクではなく、あなたの答えにコードを含めてください(今回はあなたのためにしました)。 –

+2

私はこれがうまくいくとは思っていません - あなたの機能はウェブページにアクセスできません。 'window'ではなく' unsafeWindow'にプロパティ 'foo'を設定する必要があります。 –

+0

あなたは正しいです!一定。 –

1

を使用できSandbox

// Define DOMContentLoaded event listener in the overlay.js 
document.getElementById("appcontent").addEventListener("DOMContentLoaded", function(evt) { 
    if (!evt.originalTarget instanceof HTMLDocument) { 
     return; 
    } 

    var view = evt.originalTarget.defaultView; 
    if (!view) { 
     return; 
    } 

    var sandbox = new Components.utils.Sandbox(view); 
    sandbox.unsafeWindow = view.window.wrappedJSObject; 
    sandbox.window = view.window; 
    sandbox.document = sandbox.window.document; 
    sandbox.__proto__ = sandbox.window; 

    // Eval your JS in the sandbox 
    Components.utils.evalInSandbox("function foo() {..}", sandbox); 
}, false); 
関連する問題