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

使用querySelectorAll批量为元素添加多属性及报错解决

使用querySelectorAll批量为元素添加多属性及报错解决

嘿,我明白你遇到的问题了!你说得完全没错——querySelectorAll返回的是一个静态NodeList集合,不是单个DOM元素,所以直接在这个集合上调用setAttribute肯定会报那个类型错误,因为集合本身没有这个方法,必须遍历集合里的每一个元素,对单个元素执行属性设置才行。

先看你代码里的小细节:你的setMultipleAttributes函数里,用的是外部的eleAttributes变量,而不是传入的attributesToSet参数,这会导致函数失去通用性,逻辑上也有点冗余。不过核心报错原因还是没正确处理NodeList的遍历(你后来写的for循环其实是对的,可能是之前没加循环时触发的报错?)。

我给你修正后的完整代码,同时优化了遍历方式,让代码更简洁:

修正后的JavaScript代码

function theLazyLoader () {
  const eleAttributes = {
    loading: 'lazy',
    class: 'lazy-load-spinner',
  };
  
  // 修正函数逻辑,使用传入的属性参数
  function setMultipleAttributes(elmnt, attributesToSet) {
    Object.keys(attributesToSet).forEach(attrName => {
      elmnt.setAttribute(attrName, attributesToSet[attrName]);
    });
  }
  
  var elements = document.querySelectorAll(".lazy-load-wrapper img");
  
  // 方式1:你原来的for循环(完全可行)
  // for(var i = 0; i < elements.length; ++i){
  //   setMultipleAttributes(elements[i], eleAttributes); 
  // }

  // 方式2:用forEach遍历,代码更简洁
  elements.forEach(element => {
    setMultipleAttributes(element, eleAttributes);
  });
}
theLazyLoader();

CSS代码(保持不变)

img {
  width: 400px;
  height: 300px;
  display: block;
  margin: 10px auto;
  border: 0;
}

.lazy-load-spinner {
  background: url("https://cdn.pixabay.com/animation/2023/10/10/13/27/13-27-45-28_512.gif") center center/100px 100px no-repeat #F1F1FA;
}

HTML代码(保持不变)

<div class="lazy-load-wrapper">
  <img src="https://ik.imagekit.io/demo/img/image1.jpeg?tr=w-400,h-300" />
  <img src="https://ik.imagekit.io/demo/img/image2.jpeg?tr=w-400,h-300" />
  <img src="https://ik.imagekit.io/demo/img/image3.jpg?tr=w-400,h-300" />
  <img src="https://ik.imagekit.io/demo/img/image4.jpeg?tr=w-400,h-300" />
  <img src="https://ik.imagekit.io/demo/img/image5.jpeg?tr=w-400,h-300" />
  <img src="https://ik.imagekit.io/demo/img/image6.jpeg?tr=w-400,h-300" />
  <img src="https://ik.imagekit.io/demo/img/image7.jpeg?tr=w-400,h-300" />
  <img src="https://ik.imagekit.io/demo/img/image8.jpeg?tr=w-400,h-300" />
  <img src="https://ik.imagekit.io/demo/img/image9.jpeg?tr=w-400,h-300" />
  <img src="https://ik.imagekit.io/demo/img/image10.jpeg?tr=w-400,h-300" />
</div>

关键知识点总结:

  • querySelectorAll返回的NodeList是类数组集合,不能直接调用单个DOM元素的方法(比如setAttribute),必须遍历每个元素。
  • 遍历NodeList的方式有很多:传统for循环、forEach(现代浏览器原生支持)、或者展开成数组[...elements].forEach(...)兼容更老浏览器。
  • 函数内部尽量使用传入的参数,避免依赖外部变量,这样函数更灵活可复用。

备注:内容来源于stack exchange,提问作者clarkf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 12:43:00