【问题标题】:How to inject a JavaScript function to all web page using Firefox extension如何使用 Firefox 扩展向所有网页注入 JavaScript 函数
【发布时间】:2012-01-15 18:21:28
【问题描述】:

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

function foo() {..}

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

我看过其他答案,例如:http://groups.google.com/group/greasemonkey-users/browse_thread/thread/3d82a2e7322c3fce

但需要在网页上进行修改。如果我想将函数 foo 注入 Google.com 怎么办?有可能吗?

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

【问题讨论】:

  • 我之前没有构建过 firefox 插件,但我假设,如果您可以访问 window 对象,您可以将脚本添加到文档的头部,然后调用它.我不确定该脚本是否可供他们的脚本调用您的脚本,但值得一试。您可能必须在代码中创建一个设置为 sudo 文档就绪调用的标志。
  • @Rook,greasemonkey 工作,但我想创建一个扩展,以便更好地部署到大量机器。我认为既然 gm 能够做到这一点,我应该能够连接一些 API 来做同样的事情。

标签: javascript firefox firefox-addon greasemonkey


【解决方案1】:

阅读您的问题时,我首先想到的是“这看起来像是一个骗局”。你想达到什么目的?

不管怎样,这里是a Jetpack (Add-on builder) add-on that injects a script in every page loaded

ma​​in.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();

【讨论】:

  • 在您的答案中包含代码,而不仅仅是指向外部网站的链接(这次我已经为您完成了)。
  • 我怀疑这会起作用 - 您的功能将无法访问网页。您应该在 unsafeWindow 而不是 window 上设置属性 foo
  • 您也不需要将foo(); 更改为unsafeWindow.foo(); 吗?此外,如果您回复 @WladimirPalant,他会知道您已回复,因此他可以对答案进行投票。 ;)
  • @ReubenMorais:另外我会使用contentScriptWhen: "start"(会在任何页面的 JavaScript 可以运行之前注入函数)。
【解决方案2】:

如果您在页面上使用 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 注入,我会这样做。

希望对您有所帮助。

【讨论】:

    【解决方案3】:

    您可以使用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);
    

    【讨论】:

      猜你喜欢
      • 2010-10-30
      • 2022-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多