事件委託實現樹形選單
阿新 • • 發佈:2020-07-11
HTML:
<ul class="tree" id="tree"> <li>Animals <ul> <li>Mammals <ul> <li>Cows</li> <li>Donkeys</li> <li>Dogs</li> <li>Tigers</li> </ul></li> <li>Other <ul> <li>Snakes</li> <li>Birds</li> <li>Lizards</li> </ul> </li> </ul> </li> <li>Fishes <ul> <li>Aquarium <ul> <li>Guppy</li> <li>Angelfish</li> </ul> </li> <li>Sea <ul> <li>Sea trout</li> </ul> </li> </ul> </li> </ul>
JS:
<script> // 將所有li包裝到span中 // 因為正常的li會佔據100%的寬度,而span恰好是內容的寬度 //避免點選空白時觸發事件 for (let li of tree.querySelectorAll('li')) { //建立span元素 let span = document.createElement('span'); //在每個li之前插入span li.prepend(span); //span的結尾插入span的下一個兄弟(是li) span.append(span.nextSibling); // move the text node into span } // catch clicks on whole tree tree.onclick = function(event) { if (event.target.tagName != 'SPAN') { return; } let childrenContainer = event.target.parentNode.querySelector('ul'); if (!childrenContainer) return; // no children childrenContainer.hidden = !childrenContainer.hidden; } </script>