用于扫描到DOM的递归函数

时间:2017-03-14 12:39:42

标签: javascript dom recursion

我正在阅读Marijn Haverbeke的Eloquent Javascript。我来自Flash / AS3编程背景,但觉得这本书对于让我快速掌握有用。下面是HTML和JS片段,它扫描DOM以查找特定节点是否具有给定字符串:

<!doctype html>
<html>
  <head>
    <title>My home page</title>
  </head>
  <body>
    <h1>My home page</h1>
    <p>Hello, I am Marijn and this is my home page.</p>
    <p>I also wrote a book! Read it
      <a href="http://eloquentjavascript.net">here</a>.</p>
  </body>
</html>

function talksAbout(node, string) {
  if (node.nodeType == document.ELEMENT_NODE) {
    for (var i = 0; i < node.childNodes.length; i++) {
      if (talksAbout(node.childNodes[i], string))
        return true;
    }
    return false;
  } else if (node.nodeType == document.TEXT_NODE) {
    return node.nodeValue.indexOf(string) > -1;
  }
}

console.log(talksAbout(document.body, "book"));
// → true

我当然得到函数,数组和一般语法,但是以下行是如何工作的。

if (talksAbout(node.childNodes[i], string))
        return true;

一般性解释这个函数对我有用,因为它没有在书中详细说明。谢谢!

1 个答案:

答案 0 :(得分:0)

它是一个递归函数。

这意味着它是一个自我调用的函数(深入到对象/进行进一步处理)。

每当您的talksAbout函数找到ELEMENT_NODE时,它将浏览ELEMENT_NODE,直到遇到TEXT_NODE。

当找到TEXT_NODE时,它将评估字符串是否显示为文本中给出的字符串。然后将该结果一直返回到链中。

它的作用是:

  • talksAbout(document.body的)
    • talksabout(document.body.h1)
      • talksabout(document.body.h1.text)
        return false
      • return false
    • return false
  • result = false
  • 下一个节点
    • talksAbout(document.body.p)
      • talksabout(doucment.body.p.text)
        return false
      • return false
    • return false
  • result = false
  • 下一个节点
    • talksAbout(document.body.p)
      • talksabout(doucment.body.p.text)
        返回true
      • return true
    • return true
  • return true