我的 Firefox 扩展中的变量未定义错误

Variable is not defined error in my Firefox extension

我正在开发 Firefox 附加组件。当我 运行 它时,我打开浏览器控制台并显示 AMO_Uedit_Beta_Firefox is not defined :browser.xul.

<?xml version="1.0"?>
<?xml-stylesheet href="chrome://Uedit/skin/skin.css" type="text/css"?>
<!DOCTYPE Uedit SYSTEM "chrome://Uedit/locale/translations.dtd">
<overlay id="Uedit-overlay" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
    <script src="Uedit.js" />
    <toolbarpalette id="BrowserToolbarPalette">
        <toolbarbutton id="Uedit" class="toolbarbutton-1" label="Edit HTML" tooltiptext="Edit HTML" oncommand="AMO_Uedit_Beta_Firefox.Uedit()" />
    </toolbarpalette>
</overlay>

调用作为对象一部分的函数的工具栏按钮 (AMO_Uedit_Beta_Firefox)。

我仔细检查了名称,它们都匹配。是因为脚本没有正确加载吗?我确定不是变量名不能以大写字母开头。

var AMO_Uedit_Beta_Firefox={ // This is for "wrapping the loose variables."

两个文件的引用完全相同。难道是因为脚本根本没有加载?

<toolbarbutton id="Uedit" class="toolbarbutton-1" label="Edit HTML" tooltiptext="Edit HTML" oncommand="AMO_Uedit_Beta_Firefox.Uedit()" />

我尝试在 browser.xul 中将相对 URL (<script src="Uedit.js" />) 更改为绝对 URL (<script src="chrome://Uedit/Uedit.js" />),但现在它只是 returns 一条空白的错误信息。

Weird blank error message.

这些错误导致附加组件的其余部分根本无法工作,因此在修复此问题之前我无法继续开发它。有哪些可能的解决方案?

编辑:

我想出了一个解决办法。我必须在第一个语句之前放一行 JavaScript。

var AMO_Uedit_Beta_Firefox = { // Will not work!
    ...

如果我在前面放一个console.log,比如

console.log("");
var AMO_Uedit_Beta_Firefox = { // This will work!
    ...

唯一的问题是,为什么这样做有效?

Uedit.js 文件的路径似乎有误。您应该在 xul 覆盖层中使用绝对路径。

一样,您的 Uedit.js 脚本的 link 是错误的。这是错误的最小值,也是控制台中抱怨的事情:browser.xul:5browser.xul 中的第 5 行,即:

<script src="Uedit.js" />

您声明您已经尝试过:

<script src="chrome://Uedit/Uedit.js" />

那是行不通的。至少,它应该是这样的:

<script src="chrome://Uedit/content/Uedit.js" type="application/x-javascript" />

注意 //Uedit/ 之后的 content/。然而,这是正确的,前提是您已经使用适当的 content 行设置了 chrome.manifest 以及代码隐含的其他行(skinlocale)。它还假定 Uedit.js 在该目录中。假设您的附加组件的目录结构是正常的,那么您的 chrome.manifest 文件中的内容行将类似于:

content        Uedit        chrome/content/

至于它是否实际工作,我们无法知道它是否会工作,因为您没有包含定义所有 AMO_Uedit_Beta_Firefox,特别是 AMO_Uedit_Beta_Firefox.Uedit() 的源代码。例如,除了上述问题外,很容易出现阻止脚本加载的语法错误。当您尝试将 AMO_Uedit_Beta_Firefox.Uedit() 作为 toolbarbuttononcommand.[=33= 的代码执行时,这样的语法错误会导致控制台报告 AMO_Uedit_Beta_Firefox 未定义]

您可以轻松地测试您的 Uedit.js 脚本是否正在加载,方法是在脚本加载时在控制台中打印一些内容(即在 AMO_Uedit_Beta_Firefox 的定义之外)。

我想出了一个解决办法。我必须在第一个语句之前放一行 JavaScript。

var AMO_Uedit_Beta_Firefox = { // Will not work!
    ...

如果我在前面放一个console.log,比如

console.log("foo bar");
var AMO_Uedit_Beta_Firefox = { // This will work!
    ...

我自己解决了这个问题,虽然解决方法很奇怪。