我一直在研究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。
答案 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
)。