【问题标题】:Defining Firefox extension preferences dynamically动态定义 Firefox 扩展首选项
【发布时间】:2012-10-16 16:28:29
【问题描述】:

我有一个 Firefox 扩展,它实现了一些可以从 Firefox 的上下文菜单中调用的小功能。我制作了一个首选项窗口,显示每个首选项的无线电组,允许该功能显示在主 Firefox 菜单中,显示在扩展创建的子菜单中,或隐藏。这对每个扩展函数的工作方式完全相同,只是以下内容发生了变化:首选项 id、首选项名称、被调用函数名称和每个无线电组的标签。是否可以为每个函数创建一个包含这四个字符串的数组,然后动态定义所有首选项,而不是为每个首选项复制和粘贴相同的代码?

我很确定可以在我的首选项窗口中动态定义 XUL。但是,我不确定是否使用 pref() 命令在 defaults 文件夹中定义默认首选项(我不确定如何访问扩展中其他位置定义的字符串)。我也不确定preferences.xul文件的定义是否可以动态定义或者是否需要输入。

另外,您认为这是一个好主意还是坏主意?我在想它会使添加/删除功能更容易。

【问题讨论】:

    标签: firefox-addon xul


    【解决方案1】:

    对我来说听起来是个好主意。您可以在静态 XUL 文件中执行的任何操作,您都可以通过使用 DOM 函数创建 XUL 窗口的内容(包括 preferences.xul 的内容,无论它们可能是什么)来动态执行。就默认值而言,如果尚未设置任何值,您可以在浏览器启动时使用首选项 API 手动设置它们。您可以使用observer service 来处理profile-after-change 通知。使用 preferences API 检查您的首选项是否已经设置了值,如果没有,请将它们设置为您选择的默认值。

    要检查首选项是否已经存在,请使用适当的nsIPrefBranch 方法尝试获取它。如果抛出异常则不存在。

    【讨论】:

    • 感谢有关使用首选项 API 设置首选项的建议。我会试试的。在您回复之前,我已经通过使用 JSON 将包含首选项的数组保存为字符串来接近工作,但能够将它们保存为个人首选项应该更干净。
    • 使用 profile-after-change 通知初始化首选项是否重要?我的扩展有一个由“加载”事件侦听器调用的 init() 函数,因此我正在考虑将首选项设置在那里。我必须了解有关扩展的更多信息才能执行更改后的配置文件通知。
    • 我使用我的 init() 函数实现了我的动态首选项,一切似乎都正常。只是为了以防万一以后有人看到它:我将所有首选项存储为一个字符串数组,作为一个字段存储在我的主扩展对象中。然后我编写了一个函数来循环这个数组,并为每个字符串创建所有必要的 XUL,其中 id 使用该字符串形成,并将 prefpane 的 onpaneload 设置为这个函数。另一个函数循环遍历数组并将每个首选项设置为 init() 中的默认值(如果未设置)。
    • 请注意,每次打开新窗口时都会调用 init()。我想如果您只是检查无关紧要的缺失值。所以 profile-after-change 可能更正确,但你的解决方案已经足够好了。
    • 感谢您的帮助。我将尝试切换到使用更改后的配置文件,但我不太了解您链接到该描述的页面。不过,我会在一个新问题中问这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多