0

このコードは (少なくとも Firefox では) 実行され、名前の前に _ を付けることでサブメニューを持つように指定された 3 つの要素に onmouseover イベント ハンドラーを作成してアタッチします。ハンドラーを持つべきでないものにはハンドラーを追加しません。

Firebug でトレースすると、すべて正常に動作しているように見えます。つまり、ハンドラーは正しい ID と navtitle でアタッチされます。

ブラウザーでは、正しい要素に発生するマウスオーバー イベントがあります。ただし、イベント ハンドラが「Other」にアタッチされていないにもかかわらず、すべてのケースでそのイベント ハンドラに渡されるパラメータは「6」と「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;
}
4

3 に答える 3

0

mouseover次のようにハンドラーを割り当ててみてください。

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

これにより、ハンドラーは、ハンドラーが作成されたときの値を保持するクロージャーになりますiinavtitle

于 2012-06-24T03:00:59.903 に答える
0

dropmenu(ii, navtitle) はループが終了したときiiと等しいため、原因です。のスナップショットを取得して、代わりに渡すnnav必要があります。iidropmenu

于 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 に答える