で、別解として >>5 でも書いたが、たとえば
document./*@cc_on @if (@_jscript) attachEvent('on' + @else@*/
addEventListener(/*@end@*/ 'click',
function (e) {
var t = e.target || event.srcElement;
if (t.nodeName == 'A') {
// この a 要素に対応する要素の表示・非表示
} else {
// 全メニューの非表示
}
}, true)
のようにすれば、イベントリスナ登録が 1 回で済む(いちいち onclick を埋め込む必要などない)。また、メニューはリスト構造になることが多く、ul/ol 要素などでマークアップしている「はず」だから、階層構造を辿れば id に頼らずとも関連ブロックを識別できる。
なお完全に余談だが、Firefox、Opera ならば
document.addEventListener ('DOMNodeInserted',
function (e) {
var t = e.target
if (t.nodeName == 'DIV' && t.className == 'submenu') {
t.style.display = 'none';
}
}, true)
のように、ノード出現時点で(ページの load 完了を待たずとも)初期化できる。この時点で非表示にしたノードを Array にでも保持しておけば、全メニューの非表示も簡単にできる。