Ошибка "Переменная не определена" в моем расширении Firefox
Я разрабатываю дополнение для 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()" />
Я попытался изменить относительный URL (<script src="Uedit.js" />
) на абсолютный URL (<script src="chrome://Uedit/Uedit.js" />
) в browser.xul, но теперь он просто возвращает пустое сообщение об ошибке.
Странное пустое сообщение об ошибке.
Эти ошибки приводят к тому, что остальная часть надстройки вообще не работает, поэтому я не могу продолжать ее разработку, пока это не будет исправлено. Какие есть возможные решения?
РЕДАКТИРОВАТЬ:
Я нашел решение. Я должен поставить строку JavaScript перед первым утверждением.
var AMO_Uedit_Beta_Firefox = { // Will not work!
...
Если я поставлю console.log
в передней части, например.
console.log("");
var AMO_Uedit_Beta_Firefox = { // This will work!
...
Вопрос только в том, почему это работает?
3 ответа
Я нашел решение. Я должен поставить строку JavaScript перед первым утверждением.
var AMO_Uedit_Beta_Firefox = { // Will not work!
...
Если я поставлю console.log
в передней части, например.
console.log("foo bar");
var AMO_Uedit_Beta_Firefox = { // This will work!
...
Я сам решил проблему, хотя решение странное.
Похоже, путь к Uedit.js
файл неверный. Вы должны использовать абсолютный путь в своем оверлейном слое.
Как сказал Эрикволд, ссылка на ваш Uedit.js
Сценарий неверен. Это минимум, который является неправильным и на который жалуются в консоли: browser.xul:5
строка 5 в browser.xul
, который:
<script src="Uedit.js" />
Вы заявляете, что пытались:
<script src="chrome://Uedit/Uedit.js" />
Это не будет работать. Как минимум, это должно быть что-то вроде:
<script src="chrome://Uedit/content/Uedit.js" type="application/x-javascript" />
Обратите внимание content/
после //Uedit/
, Тем не менее, это верно, предполагает, что вы настроили свой chrome.manifest с соответствующим content
строка в дополнение к другим, подразумеваемым вашим кодом (skin
а также locale
). Это также предполагает, что Uedit.js
находится в этом каталоге. Предполагая, что структура каталогов вашей надстройки нормальная, строка содержимого в вашем файле chrome.manifest будет выглядеть примерно так:
content Uedit chrome/content/
Что касается того, что он действительно работает, у нас нет способа узнать, будет ли он работать, поскольку вы не включили исходный код, который определяет все AMO_Uedit_Beta_Firefox
а конкретно нет AMO_Uedit_Beta_Firefox.Uedit()
, Например, в дополнение к вышеупомянутой проблеме, может легко быть синтаксическая ошибка, которая препятствует загрузке сценария. Такая синтаксическая ошибка приведет к тому, что консоль сообщит, что AMO_Uedit_Beta_Firefox
был неопределен при попытке выполнить AMO_Uedit_Beta_Firefox.Uedit()
как код для toolbarbutton
"s oncommand
,
Вы можете легко проверить, если ваш Uedit.js
скрипт загружается, когда что-то печатается в консоли при загрузке скрипта (т.е. вне определения AMO_Uedit_Beta_Firefox
).