如何使用Firefox扩展将JavaScript函数注入到所有网页

时间:2012-01-15 18:21:29

标签: javascript firefox firefox-addon greasemonkey

我正在开发一个Firefox插件。我想要做的是注入自定义JavaScript函数。

function foo() {..}

所以所有页面都可以调用 foo 而不先定义它。

我从其他答案中看到:http://groups.google.com/group/greasemonkey-users/browse_thread/thread/3d82a2e7322c3fce

但它需要在网页上进行修改。如果我想将功能 foo 注入Google.com怎么办?是否可以这样做?

我可以使用用户脚本来完成,但是如果可能的话我想使用扩展方法。

3 个答案:

答案 0 :(得分: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();

答案 1 :(得分:1)

如果您在页面上使用javascript函数进行简单的href,该怎么办? 像书签一样工作。

以下是示例代码:

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。
它必须只有一行代码,url格式化,但为了代码可读性,我已经形成了它。

我从来没有开发过Firefox扩展,但是对于javascript注入,这就是我要滚动的方式。

希望它有所帮助。

答案 2 :(得分: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);