≪ Today I learned.
RSS購読
    公開日
    タグ
    JavaScript
    著者
    ダーシノ

    TreeWalkerを使ってDOMツリーを効率的に走査する

    TreeWalkerオブジェクトでNodeFilterを使うことでDOMツリーを効率的に走査できる。

    以下のサンプルコードではNodeFilter.SHOW_ELEMENTでElementノードのみを走査している。ちなみにNodeFilterはenumなのでNodeFilter.SHOW_ELEMENT = 1のようになっている。

    <section id="target">
      <p>One</p>
      <div>
        <p>Two</p>
        <div>
          <p>Three</p>
        </div>
      </div>
      <p class="skip">Four</p >
    </section>
    const target = document.querySelector('#target')
    
    const walker = document.createTreeWalker(
      target,
      NodeFilter.SHOW_ELEMENT,
      (node) => {
        // class="skip"は除外
        return node.classList.contains('skip')
          ? NodeFilter.FILTER_SKIP
          : NodeFilter.FILTER_ACCEPT
      }
    )
    
    let current = walker.nextNode()
    while (current) {
      console.log(current)
      current = walker.nextNode()
    }
    1. <p>One</p>
    2. (
      <div>
        <p>Two</p>
        <div>
          <p>Three</p>
        </div>
      </div>
    )
    3. <p>Two</p>
    4. <div>
        <p>Three</p>
      </div>
    5. <p>Three</p>
    6. [SKIP]

    他にも NodeFilter.SHOW_TEXTをした場合はテキストノードのみを走査できる。

    const walker = document.createTreeWalker(
      target,
      NodeFilter.SHOW_TEXT,
      (node) => {
        // HTMLに含まれるインデントスペースも含まれるので除外する
        return node.textContent.trim() === ''
          ? NodeFilter.FILTER_SKIP
          : NodeFilter.FILTER_ACCEPT
      }
    )
    
    let current = walker.nextNode()
    while (current) {
      console.log(current.textContent)
      current = walker.nextNode()
    }
    1. One
    2. Two
    3. Three
    4. Four

    利用事例