javascript - 如何在 Firefox 插件中仅运行一个代码实例?

标签 javascript firefox firefox-addon

我在主窗口上监听 onload 事件,然后在每个浏览器/选项卡上监听 DOMContentLoaded 事件(我最多需要在浏览器中运行代码)并用 controlExecuted 标记代码在浏览器上运行。

window.addEventListener("load", function(){
    try{
        var controlExecuted = 0;
        var appcontent = document.getElementById("appcontent"); // browser
        if (appcontent && controlExecuted == 0)
            appcontent.addEventListener("DOMContentLoaded", function docLoader(e){
                appcontent.removeEventListener("DOMContentLoaded", docLoader, false);
                alert('run code')
                controlExecuted = 1;
            }, true);
    }catch(e){
        // log!
    }
}, false);

这不起作用。根据浏览器/选项卡的数量,代码会运行多次。

那么如何在 Firefox 插件中只运行一个代码实例呢?

最佳答案

正如您所注意到的,每次打开新的浏览器窗口时您的代码都会运行。您可能没有意识到一个窗口中的脚本完全独立另一个窗口中的相同脚本。也就是说,每次都会实例化一组新的对象,这意味着一个窗口中的 controlExecuted 与另一个窗口中的 controlExecuted 不是同一个对象。

在扩展程序中共享代码有两种主要方法:

  • 创建 XPCOM component 。这是在浏览器扩展中共享代码的经典、更困难(但非常强大)的方法。

  • 创建 JavaScript code module (JSM)。简而言之:

    JavaScript code modules are a concept introduced in Gecko 1.9 and can be used for sharing code between different privileged scopes. Modules can also be used to create global JavaScript singletons that previously required using JavaScript XPCOM objects.

您还可以考虑将此标志设置为用户首选项,您的脚本的每个实例都可以读取该标志。对于如此简单的用例,这可能是最简单的方法。

关于javascript - 如何在 Firefox 插件中仅运行一个代码实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8433449/

相关文章:

javascript - 当字符串包含非数字字符时,parseFloat() 如何工作?

javascript - 是否有理由在高级编译中对私有(private)变量使用@type?

javascript - 如果 JSON 和 Array 中存在相同的值,请执行某些操作

java - 使用 Webdriver 接受不受信任的 SSL 证书,用于单击菜单选项时打开的窗口

firefox-addon - 如何在 Firefox Jetpack 附加组件中的背景脚本和内容脚本之间共享 javascript 代码?

javascript - 使用 Firefox 插件的跨域通信

javascript - jQuery 字符计数 - 函数未被调用

css - 图片在 Firefox 上没有响应

http - Amazon S3 CORS header 仅在 OPTIONS(预检)期间显示,而不在 GET 请求期间显示

javascript - Firefox Inspector 的 Walker 如何工作?