递归搜索节点树

时间:2017-04-28 18:02:48

标签: javascript recursion

场景:我有一个无序的列表项列表。在每个列表项中是一个span,每个span中都有一个img标记。所以我的html结构看起来像这样。

<ul class="slider-controls">
    <li data-preview1="./images/1.1.jpeg" data-preview2="./images/1.2.jpeg"><span><img src="./images/color1.jpeg"></img></span></li>
    <li data-preview1="./images/2.1.jpeg" data-preview2="./images/2.2.jpeg"><span><img src="./images/color2.jpeg"></img></span></li>
    <li data-preview1="./images/3.1.jpeg" data-preview2="./images/3.2.jpeg"><span><img src="./images/color3.jpeg"></img></span></li>
  </ul>

img标签只是很小的方形颜色样本,并且跨度被设计成圆形,所以你拥有的基本上是一个三色点的颜色选择器供用户点击。

当用户点击li时,我正在使用javascript来抓取数据预览,以便我可以使用该信息来更改图片。如果用户在圆圈外略微点击,这可以很好地工作。但是,如果他们在圈内点击,他们最终会点击img标签。但我需要的数据是li标签中的两个父节点!

所以我写了一个递归函数来解决这个问题。

function findUpTag(el, tag) {
  console.log(el.tagName, tag);
    if (el.tagName === tag) {
      console.log("success!", el);
      return el;
    } else {
      findUpTag(el.parentNode, tag);
    }
}

我像findUpTag(el, "LI");

一样使用它

我知道我的递归搜索正在工作,因为当当前元素===“LI”时,我总是得到console.log(“success”)输出。

但是,单击图像标记时的返回值始终未定义!即使我的方法找到了LI!

我做错了什么?

1 个答案:

答案 0 :(得分:5)

这是因为您没有返回递归调用的结果。您还需要处理el.parentNode null的情况:

function findUpTag(el, tag) {
  console.log(el.tagName, tag);
    if (el.tagName === tag) {
      console.log("success!", el);
      return el;
    } else {
      return el.parentNode ? findUpTag(el.parentNode, tag) : null; // <====
    }
}

FWIW,虽然你可以使用递归,但是没有必要;只有一条路径 up 树。所以它可能只是一个简单的循环:

function findUpTag(el, tag) {
  while (el) {
    if (el.tagName === tag) {
      console.log("success!", el);
      return el;
    }
    el = el.parentNode;
  }
  return null;
}