You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何递归通过类名查找嵌套div内的指定元素且不使用querySelector

问题核心原因

  • 递归遍历子元素时使用了forEach方法,该方法无法中途终止遍历,即使某个子树中找到了目标元素,后续其他子树返回的null会覆盖已经得到的正确目标值
  • 当直接子元素未匹配到目标,进入递归分支完成遍历后,没有显式返回found变量,函数该分支最终默认返回undefined

提示:你提供的HTML示例存在标签闭合错误,所有span元素的结束标签误写为</div>,实际运行时需要修正,否则DOM结构解析异常会影响查找结果。

修复后的代码

function getElem(cell, name) {
  let found;
  // 校验当前元素是否为目标
  if (cell.classList.contains(name)) return cell;
  // 无后代元素直接返回空
  if (cell.children.length === 0) return null;

  // 优先查找当前层级的直接子元素
  found = Array.from(cell.children).find(element => element.classList.contains(name));
  if (found) return found;

  // 直接子元素未找到,递归遍历每个子元素的后代,找到即终止
  Array.from(cell.children).some(element => {
    found = getElem(element, name);
    return found !== null;
  });

  // 返回最终查找结果
  return found;
}

// 调用测试
console.log(getElem(document.getElementById("block-one"), "main-tag"));

关键修改说明

  • 把forEach替换为some方法,只要某一个子树返回了非null的结果,就立即终止遍历,避免目标值被覆盖
  • 递归遍历结束后增加显式的return found语句,保证所有分支都有返回值

内容的提问来源于stack exchange,提问作者Shubham Maheshwari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 00:06:00