【问题标题】:Variable is not defined error in my Firefox extension我的 Firefox 扩展中未定义变量错误
【发布时间】:2015-06-09 21:53:11
【问题描述】:

我正在开发一个 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 (&lt;script src="Uedit.js" /&gt;) 更改为绝对 URL (&lt;script src="chrome://Uedit/Uedit.js" /&gt;),但现在它只返回空白错误消息。

奇怪的空白错误消息。

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

编辑:

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

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

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

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

唯一的问题是,为什么会这样?

【问题讨论】:

  • 请不要使用屏幕截图来包含源代码和错误消息。此类内容应以具有适当格式的文本形式包含在问题中。这样做允许人们搜索此类内容并剪切和粘贴信息以进行测试和创建答案。
  • 没有代码,这个问题可能跑题了:寻求调试帮助的问题(“为什么这段代码不能按我想要的方式工作?”)必须包括:A ) 期望的行为; B) 一个特定的问题或错误 C) 重现它所需的最短代码所有在问题本身 .没有明确的问题陈述的问题对其他读者没有用处。请参阅:How to create a Minimal, Complete, and Verifiable exampleWhat topics can I ask about here?How to Ask
  • 您的问题没有得到很多回复,不是因为我们没有兴趣帮助您,而是因为您让我们很难做到。您没有提供足够的信息。我们需要知道什么类型的附加组件(即覆盖、无需重启、附加 SDK)。至少,我们需要能够调试的源代码。由于您提供的信息非常少(不完整!)(以非常不方便的格式,屏幕截图),我们必须通灵才能给您体面的答案。

标签: javascript debugging firefox firefox-addon xul


【解决方案1】:

Uedit.js 文件的路径似乎错误。您应该在 xul 叠加层中使用绝对路径。

【讨论】:

  • 我这样做了,但现在整个事情都不再起作用了。有一个控制台错误消息,但它是空白的,它只显示“browser.xul:第 5 行”。 (我放绝对网址的地方)
【解决方案2】:

作为erikvold has said,您的Uedit.js 脚本的链接错误。这是错误的最小值,也是控制台中抱怨的内容: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/。但是,这是正确的假设除了代码所暗示的其他行(skinlocale)之外,您还使用适当的content 行设置了chrome.manifest。它还假定Uedit.js 在该目录中。假设您的插件的目录结构是正常的,您的 chrome.manifest 文件中的内容行将类似于:

content        Uedit        chrome/content/

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

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

【讨论】:

  • 正如我评论 Erikvold 的帖子,绝对 URL 不起作用!
  • @NarawaGames 您在问题chrome://Uedit/Uedit.js 中的绝对网址当然是行不通的。它需要类似于 chrome://Uedit/content/Uedit.js (如上所述)。您还需要chrome.manifest 中的content 行,我很高兴您找到了解决方案。下次,请向我们提供足够的信息以帮助您。
  • @NarawGames,很有趣。我想知道您正在使用的目录结构、这些目录中的 Uedit.js 位置以及 chrome.manifest 的内容。
  • 目录结构和教程里说的一模一样,只是JS文件叫Uedit而不是linkTargetFinder。 (blog.mozilla.org/addons/2009/01/28/…)
【解决方案3】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多