此代码将运行(至少在Firefox中)并将通过使名称前面带有_来创建并附加指定为具有子菜单的三个元素上的onmouseover事件处理程序。它不会将处理程序添加到不应该拥有它的那些处理程序。
如果我在Firebug中追踪,一切似乎都运转良好;这就是处理程序附有正确的id和navtitle。
在浏览器中,正确的元素会触发一个mouseover事件。 但是,在每种情况下传递给该事件处理程序的参数都是'6'和'Other',尽管事实上没有事件处理程序连接到'Other'。我认为我已经正确地确定了所有内容,所以我不明白为什么会发生这种情况。
我在这里缺少什么?
谢谢!
//我将添加子元素的父元素
var navdiv = document.getElementById('nav')
var navarray = ['','Home', '_Books', '_Pictures', '_Characters','Other']
//水平菜单
var nnav = navarray.length
for (var ii = 1; ii < nnav; ii++)
{
// get title and determine whether it has a submenu
var subflag = false
var navtitle = navarray[ii]
var firstchar = navtitle[0]
if (firstchar == '_')
{
navtitle = navtitle.substring(1, navtitle.length - 1)
navtitle += '*'
subflag = true
}
// Create Div
var naventry = document.createElement('div')
var navid = 'nav' + navarray[ii]
naventry.setAttribute('id', navid)
naventry.setAttribute('class', 'navitem')
// Create Link
var lnk = document.createElement('a')
lnk.setAttribute('href', navarray[ii] + '.html')
if (subflag) // will have a submenu
{
lnk.onmouseover = function () { dropmenu(ii, navtitle) }
}
var txtnode = document.createTextNode(navtitle)
lnk.appendChild(txtnode)
naventry.appendChild(lnk)
navdiv.appendChild(naventry)
lnk = null
}
function dropmenu(which, ntitle)
{
alert('In drop menu: Id = ' + which + ' ' + ntitle)
return false;
}
答案 0 :(得分:0)
dropmenu(ii, navtitle)
是原因,因为当循环终止时ii
等于nnav
。您需要拍摄ii
的快照,然后将其传递给dropmenu
。
答案 1 :(得分:0)
改变这一点,
if (subflag) // will have a submenu
{
lnk.onmouseover = function () { dropmenu(ii, navtitle) }
}
到这个
if (subflag) // will have a submenu
{
(function(i){
lnk.onmouseover = function () { dropmenu(i, navtitle) }
})(ii);
}
我希望它能解决问题。
答案 2 :(得分:0)
尝试像这样分配mouseover
处理程序:
lnk.onmouseover = function () {
return function () {
dropmenu(ii, navtitle);
}
};
这使得处理程序成为closure,在创建处理程序时将保留ii
和navtitle
的值。