0

此代码将运行(至少在 Firefox 中),并将创建 onmouseover 事件处理程序并将其附加到指定为具有子菜单的三个元素上,方法是在名称前加上一个 _。它不会将处理程序添加到不应该拥有它的处理程序中。

如果我在 Firebug 中进行追踪,一切似乎都运行良好;也就是说,处理程序附加了正确的 id 和 navtitle。

在浏览器中,正确的元素会触发 mouseover 事件。但是,在每种情况下传递给该事件处理程序的参数都是“6”和“其他”,尽管事实上没有事件处理程序甚至附加到“其他”。我想我已经正确地确定了一切,所以我不明白为什么会这样。

我在这里想念什么?

谢谢!

// 我将添加子元素的父元素

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;
}
4

3 回答 3

0

dropmenu(ii, navtitle) 是原因,因为ii等于nnav循环终止的时间。您需要拍摄快照ii并将其传递给dropmenu

于 2012-06-24T02:22:31.593 回答
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);
}

我希望它能解决问题。

于 2012-06-24T02:22:37.307 回答
0

尝试mouseover像这样分配您的处理程序:

lnk.onmouseover = function () {
    return function () {
        dropmenu(ii, navtitle);
    }
};

这使处理程序成为一个闭包,它将保留创建处理程序时的值ii和值navtitle

于 2012-06-24T03:00:59.903 回答