<AI>
複数の ul 要素がある場合、選択した li 要素によって UI を切り替えるには、
イベント委任(親要素でのイベント監視)を使い、li 要素に設定した data-* 属性などの目印を読み取って処理を分岐させます。
具体的な手順は以下の通りです。
親(または共通の親)にイベントリスナーを登録する
クリックされたターゲットが li かどうかを判定する
data-* 属性の値を取得して UI を切り替える
実装のコード例
HTMLとJavaScriptを次のように書きます。
html
<ul class="menu-list" data-group="first">
<li data-target="ui-1">UI 1にする</li>
<li data-target="ui-2">UI 2にする</li>
</ul>
<ul class="menu-list" data-group="second">
<li data-target="ui-3">UI 3にする</li>
</ul>
<div id="ui-1" class="ui-panel">ここが UI 1 です</div>
<div id="ui-2" class="ui-panel" style="display:none;">ここが UI 2 です</div>
<div id="ui-3" class="ui-panel" style="display:none;">ここが UI 3 です</div>
javascript
// すべての .ui-panel を隠す関数
function hideAllPanels() {
const panels = document.querySelectorAll('.ui-panel');
panels.forEach(panel => {
panel.style.display = 'none';
});
}
// ドキュメント全体、または共通の親要素でクリックを監視
document.addEventListener('click', (event) => {
// クリックされた要素が li かチェック
const li = event.target.closest('li');
if (!li) return; // li 以外なら何もしない
// li に設定された data-target の値を取得
const targetId = li.getAttribute('data-target');
if (!targetId) return;
// すべての UI を非表示にしてから、対象だけを表示
hideAllPanels();
const targetPanel = document.getElementById(targetId);
if (targetPanel) {
targetPanel.style.display = 'block';
}
});
ポイント
event.target.closest('li'): li の中に別のタグ(span や a など)があっても、正しく li を見つけることができます。
data-target 属性: どの UI を表示すればよいかを li ごとに指定できるため、複数の ul があっても簡単に管理できます。