新手坚持使用Javascript for Firefox扩展(XUL)的基本事件监听器

时间:2014-01-21 20:51:12

标签: javascript xul addeventlistener

我一直在研究MDN教程,但我还没有能够让JS事件监听器工作。我完成了本页的最后一点:https://developer.mozilla.org/en-US/docs/XUL/Tutorial/Adding_Event_Handlers

在XUL中我有一个menuitem:     menuitem id =“appmenu-libraryHistory”label =“History”/>

在JS中我有这个:     var HistoryWatch = document.getElementById(“appmenu-libraryHistory”);     HistoryWatch.addEventListener('command',showLibrary,“History”);     function showLibrary(aLeftPane){...}

我认为当按下菜单条目“History”时,这会将字符串“History”传递给showLibrary函数。如果我直接从XUL传递参数,showLibrary函数确实有效,但如果我这样做,它将不允许我传递一个我最终想做的URI。

1 个答案:

答案 0 :(得分:1)

我怀疑您展示的JavaScript位于包含的文件中,作为<script>标记的一部分。它可能不起作用,因为在document.getElementById()行运行时,页面尚未构建,并且还没有具有此ID的元素。

您需要等待页面完全加载,以确保您的菜单存在。如果您正在使用单独的窗口,则可以从xul中的onload属性调用初始化函数。如果您只在现有窗口中覆盖一个菜单,则需要监听父窗口的加载事件并从那里调用初始化:

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);

请注意,在此示例中,init(和showLibrary)正在污染全局命名空间,最好将它们封装在对象中。

另请注意,顺序很重要,因为当最后一行运行时,init函数必须已经声明,否则它将不会附加任何内容(undefined)。