jQuery 后代

"后代"与"祖先"相反,指当前元素内部的所有层级:子级、孙级、曾孙级……jQuery 用 children() 与 find() 两个方法向下遍历。

演示用的嵌套结构:

<div id="outer">
    <ul>
        <li>苹果</li>
        <li>香蕉</li>
    </ul>
    <p>一段说明</p>
</div>

children():只取直接子级

children() 只返回直接子元素(第一层),孙级及更深的不算:

console.log($("#outer").children().length); // 输出:2(ul 和 p)

效果:两个直接孩子是 ul 与 p;ul 里的 li 属于孙级,不在结果中。

children() 带选择器过滤

children(选择器) 可以在直接子级中挑出符合条件的那部分:

console.log($("#outer").children("p").length); // 输出:1(只有那个 p)
console.log($("#outer").children("li").length); // 输出:0(li 不是直接子级)

find():取所有后代

find() 深入所有层级,返回全部后代中匹配选择器的元素:

console.log($("#outer").find("li").length); // 输出:2(孙级 li 也能找到)

find() 必须传选择器才最有意义;传 "*" 会返回所有后代元素:

console.log($("#outer").find("*").length); // 输出:4(ul、2 个 li 和 p;文本节点不算元素)

children() 与 find() 对比

方法搜索深度匹配范围典型用途
children()仅第一层直接子元素遍历列表项、面板子块
find()全部层级所有后代深入查找任意层节点

选型口诀:只要"儿子"用 children(),要"子孙万代"用 find()。

综合示例:菜单只折叠第一层

<div class="panel">
    <ul>
        <li>一级菜单
            <ul>
                <li>子菜单 A</li>
                <li>子菜单 B</li>
            </ul>
        </li>
    </ul>
</div>
$(".panel").children("ul").slideUp();  // 效果:只收起第一层 ul
$(".panel").find("ul").slideUp();      // 效果:所有层级的 ul 全部收起

一个收一层,一个收全部,直观看出二者差异。

小结

向下遍历两个方法:children() 只看第一层直接子级、find() 挖遍所有后代,都支持选择器过滤。搞清"只到儿子"还是"直到孙子",写遍历就不会出错。

笔记加载中…