操纵DOM元素产生死循环,你遇到过吗(附解决方案)

引言

在业务开发中,需求各种各样,我们来看这样一段代码,页面中有几个div,我想点击按钮,复制一份到list中,并且打印一下索引值看一下

html部分

    <div class="list">
        <div class="list-item"></div>
        <div class="list-item"></div>
        <div class="list-item"></div>
        <div class="list-item"></div>
    </div>
    <button id="btn">复制一份</button>

 

javascript部分 

 var list = document.getElementsByClassName('list')[0]
    var item = document.getElementsByClassName('list-item')
    var btn = document.getElementById('btn')
    btn.onclick = () => {
        for (let i = 0; i < item.length; i++) {
            var clone = item[i].cloneNode(true)
            list.appendChild(clone)
            console.log(clone);
        }
    }

 

 但是我们去浏览器运行一下试试

我们发现输出了很大的索引,并且我的页面还在无限的打印,我们的获取的item集合应该只有4个呀 ,为什么会有这种情况?

原因

我们来看获取dom元素的方式,我们通过的是document.getElementsByClassName('list-item')获取的dom元素,我们来看一下MDN上对于该方法的叙述

 

 注意其中的重点!!!!elements是一个实时的集合

 所以说,我们每一次复制一份往里面添加的时候,都会导致获取到的集合长度增加,所以会陷入死循环

解决方案

我们可以将改成使用document.querySelectorAll('.list-item')形式去获取,这个API获取的是一个静态集合

var list = document.getElementsByClassName('list')[0]
    var item = document.querySelectorAll('.list-item')
    var btn = document.getElementById('btn')
    btn.onclick = () => {
        for (let i = 0; i < item.length; i++) {
            var clone = item[i].cloneNode(true)
            list.appendChild(clone)
            console.log(i);
        }
    }

 我们再运行到浏览器去看一下

 只打印了四个索引值,证明获取的静态集合

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值