2014-01-21 4 views
1

Я работал над учебниками MDN, но я не смог заставить слушателей событий JS работать. Я до последнего бита этой страницы: https://developer.mozilla.org/en-US/docs/XUL/Tutorial/Adding_Event_HandlersНовичок зациклился на основных прослушивателях событий в Javascript для расширения Firefox (XUL)

В XUL у меня есть: Пункт в меню MENUITEM ID = "appmenu-libraryHistory" метка = "История" />

И в JS У меня есть это : var HistoryWatch = document.getElementById ("appmenu-libraryHistory"); HistoryWatch.addEventListener ('команда', showLibrary, "History"); function showLibrary (aLeftPane) {...}

Я думал, что это передало бы строку «История» функции showLibrary, когда была нажата клавиша меню «История». Функция showLibrary работает, если я передаю параметры непосредственно из XUL, но если я это сделаю, это не позволит мне передать URI, что я и хочу сделать в конце концов.

+0

Я также пробовал это, которое все еще не работает: HistoryWatch.addEventListener ('command', showLibrary.bind (null, "History"), false); – user3213358

ответ

1

Я подозреваю, что JavaScript, который вы указали, находится в файле , включая как часть тега <script>. Он может не работать, потому что к моменту окончания строки document.getElementById() страница еще не построена, и еще нет элемента с этим идентификатором.

Вам нужно подождать, пока страница будет полностью загружена, чтобы быть уверенным, что ваше меню существует. Если вы работаете в отдельном окне, вы можете вызвать функцию инициализации из своего атрибута onload в xul. Если вы накладывая только меню в существующем окне, вам нужно будет слушать событие загрузки родительского окна и вызвать инициализацию оттуда:

function init() 
{ 
    window.removeEventListener("load", init, false); // Remove the handler as we don't need it anymore. 

    var historyWatch = document.getElementById("appmenu-libraryHistory"); 
    historyWatch.addEventListener('command', showLibrary, "History"); 
} 

window.addEventListener("load", init, false); 

Обратите внимание, что в этом примере, initshowLibrary) загрязняют глобальное пространство имен, было бы лучше инкапсулировать их в объект.

Также обратите внимание, что порядок имеет значение, потому что, когда последняя строка работает, функция init должна быть объявлена ​​уже, иначе она ничего не добавит (undefined).

+0

Спасибо за ваш ответ. Это выглядит правильно. Я дам ему еще один шанс и дам вам знать, как получится :-) – user3213358

Смежные вопросы