1. 程式人生 > 實用技巧 >事件委託實現樹形選單

事件委託實現樹形選單

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>