gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 19:57:29 26 4
gpt4 key购买 nike

我在主窗口上监听 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com