花潮论坛

搜索
热搜: 活动 交友 discuz
查看: 24|回复: 5

遍历与操作容器元素子节点示例

[复制链接]
  • TA的每日心情
    奋斗
    2026-6-30 19:25
  • 签到天数: 1858 天

    [LV.Master]伴坛终老

    3265

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

    发表于 2026-6-30 19:44 | 显示全部楼层 |阅读模式

    请马上登录,朋友们都在花潮里等着你哦:)

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x

    要操作容器元素内的子节点,首先需要遍历所有子节点,接着才是去操作特定的子节点。不同的操作目的遍历的方法不一样,下面的探讨不可能包罗万象,但力求做到目标明确、操作精准:每一个实例我们将预设一个需求,然后通过遍历与过滤等手段去操作指定的子节点。具体而言:所有示例都是遍历指定容器元素的子元素节点,找出第一层级或所有层级的 img 标签,并对它们做相应操作。

    例一:添加所有第一层级img子元素的title属性

    <style>
        .mdiv { margin: 20px auto 0; width: 600px; border: 1px solid gray; padding: 12px; }
        .mdiv img { max-width: 150px; }
        .tMid { text-align: center; }
    </style>
    
    <div class="mdiv">
        <h2 class="tMid">图片title属性设置演示</h2>
        <img src="https://638183.freep.cn/638183/small/2025/ff1.webp" alt="" />
        <img src="https://638183.freep.cn/638183/small/2025/featherjpg.png" alt="" />
        <img src="https://638183.freep.cn/638183/small/2025/ring.webp" alt="" />
        <p>【说明】上面的图片初始时没有设置 title 属性,可以点击下方按钮添加该属性。请在点击前、后分别将鼠标指针移到图片上面,看看前后有什么不同。</p>
    </div>
    <p class="tMid"><button onclick="addTitle2Img();this.disabled='true';">图片元素加 title 属性</button></p>
    
    <script>
        function addTitle2Img() {
            const div = document.querySelector('.mdiv');
            const elms = div.children;
            [...elms].forEach((elm, key) => {
                if (elm.tagName === 'IMG') elm.setAttribute('title', `图 ${key}`);
            });
        }
    </script>
        

    例二:添加所有层级img子元素的title属性

    方法一:querySelectorAll()方法(最简洁高效)

    <style>
        .mdiv { margin: 20px auto 0; width: 600px; border: 1px solid gray; padding: 12px; }
        .mdiv img { max-width: 150px; }
        .tMid { text-align: center; }
    </style>
    
    <div class="mdiv">
        <h2 class="tMid">图片title属性设置演示</h2>
        <p>下图在第一层级:</p>
        <img src="https://638183.freep.cn/638183/small/2025/ff1.webp" alt="" />
        <p>下图在第二层级:</p>
        <p class="tMid"><img src="https://638183.freep.cn/638183/small/2025/featherjpg.png" alt="" /></p>
        <div>
            <p>下图在第三层级:</p>
            <p class="tMid"><img src="https://638183.freep.cn/638183/small/2025/ring.webp" alt="" /></p>
        </div>
        <p>【说明】上面的图片初始时没有设置 title 属性,可以点击下方按钮添加该属性。请在点击前、后分别将鼠标指针移到图片上面,看看前后有什么不同。</p>
    </div>
    <p class="tMid"><button onclick="addTitle2Img(document.querySelector('.mdiv'));this.disabled='true';">图片元素加 title 属性</button></p>
    
    <script>
        // 使用 querySelectorAll()方法拿到所有img元素节点并一一添加itle属性
        function addTitle2Img(elm) {
            const imgs = elm.querySelectorAll('img'); // 获取元素下所有img子元素
            imgs.forEach((img, key) => img.setAttribute('title', `图 ${key + 1}`));
        }
    </script>
        

    方法二:递归遍历元素节点(简洁但性能略差、容易爆栈)

    <style>
        .mdiv { margin: 20px auto 0; width: 600px; border: 1px solid gray; padding: 12px; }
        .mdiv img { max-width: 150px; }
        .tMid { text-align: center; }
    </style>
    
    <div class="mdiv">
        <h2 class="tMid">图片title属性设置演示</h2>
        <p>下图在第一层级:</p>
        <img src="https://638183.freep.cn/638183/small/2025/ff1.webp" alt="" />
        <p>下图在第二层级:</p>
        <p class="tMid"><img src="https://638183.freep.cn/638183/small/2025/featherjpg.png" alt="" /></p>
        <div>
            <p>下图在第三层级:</p>
            <p class="tMid"><img src="https://638183.freep.cn/638183/small/2025/ring.webp" alt="" /></p>
        </div>
        <p>【说明】上面的图片初始时没有设置 title 属性,可以点击下方按钮添加该属性。请在点击前、后分别将鼠标指针移到图片上面,看看前后有什么不同。</p>
    </div>
    <p class="tMid"><button onclick="addTitle2Img(document.querySelector('.mdiv'));this.disabled='true';">图片元素加 title 属性</button></p>
    
    <script>
        let total = 0; // 当前图片序号
        
        // 递归遍历所有子元素节点 :碰上img元素节点时加title属性
        function addTitle2Img(node) {
            // 若节点标签名是 IMG则设置 title 属性,同时 total 自增
            if (node.tagName === 'IMG') node.setAttribute('title', `图 ${++total}`);
            for (let j = 0; j < node.children.length; j ++) {
                addTitle2Img(node.children[j]); // 往内遍历其它层级的节点
            }
        }
    </script>
        

    方法三:使用 treeWalker API(抽象但更优雅、性能消耗低、不会爆栈)

    <style>
        .mdiv { margin: 20px auto 0; width: 600px; border: 1px solid gray; padding: 12px; }
        .mdiv img { max-width: 150px; }
        .tMid { text-align: center; }
    </style>
    
    <div class="mdiv">
        <h2 class="tMid">图片title属性设置演示</h2>
        <p>下图在第一层级:</p>
        <img src="https://638183.freep.cn/638183/small/2025/ff1.webp" alt="" />
        <p>下图在第二层级:</p>
        <p class="tMid"><img src="https://638183.freep.cn/638183/small/2025/featherjpg.png" alt="" /></p>
        <div>
            <p>下图在第三层级:</p>
            <p class="tMid"><img src="https://638183.freep.cn/638183/small/2025/ring.webp" alt="" /></p>
        </div>
        <p>【说明】上面的图片初始时没有设置 title 属性,可以点击下方按钮添加该属性。请在点击前、后分别将鼠标指针移到图片上面,看看前后有什么不同。</p>
    </div>
    <p class="tMid"><button onclick="addTitle2Img(document.querySelector('.mdiv'));this.disabled='true';">图片元素加 title 属性</button></p>
    
    <script>
        // 使用 treeWalker API遍历所有子元素节点 :碰上img元素节点时加title属性
        function addTitle2Img(elm) {
            let total = 0; // 当前图片序号
            let walker = document.createTreeWalker(
                elm, // 元素
                NodeFilter.SHOW_ELEMENT, // 节点过滤器 :只要元素节点
                // 过滤器 :只要img元素
                { acceptNode: (node) => node.tagName === 'IMG' ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP },
            );
            while (walker.nextNode()) {
                const node = walker.currentNode;
                node.setAttribute('title', `图 ${++total}`);
            }
        }
    </script>
        

    递归和TreeWalker:

    • 递归的核心:访问一个节点,处理它,然后依次访问它的子节点、孙节点(深度优先)。
    • TreeWalker 的实现:它内部维护了一个“遍历状态栈”(逻辑栈)。调用 nextNode() 时,它内部执行的就是标准的深度优先遍历(DFS)算法逻辑,只不过它把“递归的压栈/出栈”操作隐藏在了 API 内部,通过 currentNode 指针来记录位置。

    评分

    参与人数 2威望 +100 金钱 +200 经验 +100 收起 理由
    红影 + 50 + 100 + 50 匠心独运,细节精致入微!
    小辣椒 + 50 + 100 + 50 匠心独运,细节精致入微!

    查看全部评分

  • TA的每日心情
    开心
    2019-11-25 21:11
  • 签到天数: 1 天

    [LV.1]初来乍到

    1524

    主题

    6万

    回帖

    13万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀青草情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀男儿情怀鹰傲苍穹心香一瓣音画大师天籁妙音风雨同行我心永远喜乐安康中秋征文指尖上的流年花潮管理

    发表于 2026-6-30 20:52 | 显示全部楼层
    学习~~~
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2026-6-24 21:24
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    3

    主题

    18

    回帖

    198

    积分

    注册会员

    Rank: 20Rank: 20

    发表于 2026-6-30 21:14 | 显示全部楼层
    学习中。若如文中所言“遍历“只是这100多行的代码,理论上觉得可试,因为阐述的特别清晰,代码启蒙教程,难得。谢谢分享,辛苦。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1898

    主题

    33万

    回帖

    40万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2026-6-30 22:07 | 显示全部楼层
    要想操作子元素,需要遍历这些子元素。黑黑给出了第一层级和所有层级的不同操作方法,以实例讲解,更容易理解。实现这些操作还有不同的方法,每种都做了实例讲解,黑黑辛苦了
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2026-6-30 08:55
  • 签到天数: 581 天

    [LV.9]以坛为家II

    380

    主题

    4491

    回帖

    2万

    积分

    版主

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生鹰傲苍穹飞龙在天王者至尊大将风范花潮版主

    发表于 2026-6-30 23:36 | 显示全部楼层
    感受到异曲同工之妙,谢谢马老师深入浅出的实例化讲授
    ★青春是一个人的精神生命,奋斗是一个人最大的体面,学习是一个人最美的姿态。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2026-7-1 00:12
  • 签到天数: 203 天

    [LV.7]常住居民III

    352

    主题

    3696

    回帖

    2万

    积分

    版主

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪七彩绚丽金剪刀开朗大方花潮版主

    发表于 2026-6-30 23:41 | 显示全部楼层
    马老师晚上好!

    刚读了您的帖子,实话实说,挺感谢的。同道中人好说话,一点就透,您这是托儿所教材,因为我能理解您说的是什么,具体内容我在逐行逐个元素的都理解了,这样“遍历“一遍绝对有好处!谢谢您,晚安。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|服务支持:DZ动力|huachaowang.com Inc. ( 蜀ICP备17032287号-1 )

    GMT+8, 2026-7-1 01:08 , Processed in 0.062166 second(s), 26 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表