addEventListener と attachEvent を使用してクリックとマウスの機能を処理する、基本的な JavaScript ドロップダウン メニューに取り組んできました。クリック イベントによって呼び出される関数 subOpen は、JavaScript の「this」キーワードを使用して、クリックされた要素の ID を取得します。
イベント追加のサンプル:
//add event listeners to menuitems
for (var i=0; i < menuitems.length; i++) {
if (menuitems[i].addEventListener) {
menuitems[i].addEventListener('click', subOpen, false);
menuitems[i].addEventListener('mouseout', closeTimer, false);
menuitems[i].addEventListener('mouseover', cancelTimer, false);
menuitems[i].addEventListener('selectstart', menucursorselect, false);
} else if (menuitems[i].attachEvent) {
menuitems[i].attachEvent('onclick', subOpen);
menuitems[i].attachEvent('onmouseout', closeTimer);
menuitems[i].attachEvent('onmouseover', cancelTimer);
menuitems[i].attachEvent('onselectstart', menucursorselect);
}
}
「this」キーワードを使用した subOpen 関数のサンプル:
function subOpen() {
cancelTimer(); //stops the close timer
if (submenudisplay) {
document.getElementById(submenudisplay).style.display = "none";
activeSubMenu = false;
}
var curMenuId = this.id;
var curSubMenuId = this.id + "submenu";
if (curSubMenuId) {
document.getElementById(curSubMenuId).style.display = "block";
activeSubMenu = true;
}
submenudisplay = curSubMenuId;
現在、以前のバージョンの Internet Explorer を除いて、私がテストしたすべてのブラウザーですべてが機能しています。古いバージョンの IE では、デバッガーは「this.id」に未定義のフラグを立てているため、どのサブメニューを開くべきかわかりません。いくつかの調査を行ったところ、古い IE はイベントをアタッチするときに関数をコピーせずに参照することがわかったので、「this」キーワードで有用なデータを取得する方法はありません。
古いバージョンの IE で動作する同じことを達成するために使用できる別のキーワードまたは関数があるかどうか疑問に思っていました。
私のテストコードの完全版はここにあります: