Firefox扩展开发:如何在内容脚本中创建一个全局函数,以便其他加载的脚本文件可以访问它

Firefox extension development: How do I create a global function inside a content script, so other loaded script files can access it?

本文关键字:脚本 函数 一个 全局 其他 访问 文件 加载 开发 扩展 创建      更新时间:2023-09-26

在我的main.js文件中,我有一个PageMod,其中包括一个base.js文件:

pageMod.PageMod({
    contentScriptFile: ["./base.js"]

我的base.js文件中有一个函数

function setupPayment(){ /* DO STUFF HERE */ }

在我的base.js文件中,我还加载了其他js文件

$.getScript("https://checkout.stripe.com/checkout.js", function(){
    $.getScript( self.options.stripe );
});

在我的stripe.js文件中,我试图调用base.js文件中的setupPayment函数

var yearhandler = StripeCheckout.configure({
    key: "pk_live_...",
    image: "image.png",
    name: "SHINE",
    description: "Subscription",
    panelLabel: "Subscribe",
    allowRememberMe: false,
    token: function(token) {
        plan = "yearly";
        setupPayment(token,plan);
    }
});

但是setupPayment返回undefined。

经过一些测试,通过$.getScript包含的任何脚本似乎都无法访问我的base.js内容脚本中的任何函数?有没有办法让base.js内容脚本中的一个函数在我加载的所有其他脚本文件中全局化?

谢谢你的帮助!

编辑:setupPayment()必须在base.js文件中的原因是,它可以与main.js文件通信并存储一些信息。

您现在可以将内容脚本中的函数导出到页面中,有关详细信息,请参阅本博客文章。代码如下所示:

function setupPayment(args, callback) {
  // some code
  callback(result); 
  // your callback should use postMessage to send data back to the
  // content script, see these docs:
  // https://developer.mozilla.org/en-US/Add-ons/SDK/Guides/Content_Scripts/Interacting_with_page_scripts#Communicating_with_page_scripts 
}
exportFunction(setupPayment, unsafeWindow, {defineAs: "setupPayment"});

ContentScripts在沙盒中运行,我不知道jquery在内部做什么,但它肯定不是设计的,以了解多个javascript上下文和mozilla的xray包装器,所以它可能只是向DOM中注入一个<script>标记,然后在页面上下文而不是contentScript沙盒内运行加载的javascript。

考虑到您只加载base.js,我甚至不确定您是如何在沙箱中访问jquery的。

因此,看起来您的插件代码中有很大一部分实际上正在不受信任的页面上下文中运行/加载脚本。

setupPayment()必须在base.js文件中的原因是,它可以与main.js文件通信并存储一些信息。

不完全是。您可以通过exportFunction将特权函数导出到页面上下文,该函数在沙盒中可用。