首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么除了第一次之外,document.getElementsByClassName不能准确地获取所有元素?

document.getElementsByClassName不能准确地获取所有元素的原因是因为该方法返回的是一个动态的 HTMLCollection 对象,而不是一个静态的 NodeList 对象。HTMLCollection 是一个实时的集合,它会随着文档的变化而自动更新。这意味着如果在获取 HTMLCollection 后,文档中有新的元素符合指定的类名,那么这些新元素也会被包含在 HTMLCollection 中。

然而,当使用 document.getElementsByClassName 进行查询时,它会返回一个实时的集合,而不是一个静态的快照。这意味着如果在查询之后,文档中有新的元素符合指定的类名,那么这些新元素也会被包含在返回的 HTMLCollection 中。这可能会导致在处理集合时出现问题,因为集合的长度和内容可能会发生变化。

为了解决这个问题,可以将返回的 HTMLCollection 转换为一个静态的数组,然后再进行操作。可以使用 Array.from() 方法或者扩展运算符(...)来实现这个转换。例如:

代码语言:txt
复制
const elements = Array.from(document.getElementsByClassName('className'));
// 或者
const elements = [...document.getElementsByClassName('className')];

这样就可以确保获取到的元素集合是一个静态的快照,不会受到文档变化的影响。

推荐的腾讯云相关产品:无

参考链接:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

前端资源浏览器渲染原理

渲染树会表示显示哪些节点以及其他样式,但是不表示每个节点的尺寸、位置等信息; 布局是确定呈现树中所有节点的宽度、高度和位置信息; 将每个节点绘制(Paint)到屏幕上 在绘制阶段,浏览器将布局阶段计算的每个...文件 回流和重绘 回流(reflow) reflow : 我们渲染出来的节点大小位置 也就是布局时第一次渲染出之后就确定的 之后对于节点大小和位置重新计算的行为 叫做回流(reflow) 回流在什么时候会出现...: DOM 结构发生变化 (添加 & 移除) 改变了 CSS 样式代码 也就是布局 修改了 窗口尺寸 或者是调用了某些内置函数 获取位置和尺寸信息 重绘 (reprint) 我们渲染的第一次,在之前的流程图中叫做...JS 有操作和修改DOM的作用 为什么会先去执行js脚本? 因为之前提到了 回流时很吃性能的所以最好一次性弄好 减少不必要的回流 代码案例 index.html <script src="....它的特性: 浏览器不会因 async 脚本而阻塞(与 defer 类似); async脚本<em>不能</em>保证顺序,它是独立下载、独立运行,不会等待其他脚本 async不会能保证在DOMContentLoaded之前或者之后执行

57120

公开抽奖算法!公示开奖记录!请叫我“蜻蜓队长”!

---- theme: awesome-green 开奖记录 本瓜将在此小节,公开往期所有抽奖的【开奖记录】,并会持续更新、维护这个表!...咱就是说,有需要的工友动手试试呗,这里本瓜先搞一个简陋版本的,定次数调用滚轮下滑; /***************获取所有评论的代码******************/ window.scrollTo...先模拟第一次点击展开评论 function doInterval(fn,times,duration){ let timesRun=0 var interval = setInterval...;&date.getSeconds()===0) { // 开奖 handleLottery(3) // 抽 3 个人 } },1000) 不忘初心 话说本瓜 为什么...(ง •_•)ง 欢迎大家加我加群,微信:Anthony1453,V我一起学习~~ 或者关注公众号【掘金安东尼】,上面有除了程序员之外的更多生活写文、创作; 相信技术、传递价值。

48030
  • 五一假期小作业

    演示地址:https://gethtml.cn/project/2020/05/01/index.html 遇到的问题 JavaScript不能直接操纵伪类元素,因此只能用控制类的方式 没有搞明白三种状况...定义一个列表,用于存储当前页面中的所有星(标签) 定义一个变量,用作用户是否第一次操作的标志。...(即判断是否是第一次操作) 如果是第一次操作,那么直接循环添加类名即可 不是第一次操作,需要判断是否添加过类名 在用户第一次操作后,需要判断是加星还是减星 即判断当前点击的元素是否含有星 如有有星星...,取消右边和当前点击的星 如果没有星,将左边所有未点亮的星和当前点击的星点亮 示例代码 <!...('rating')[0] var icon = document.getElementsByClassName('icon') var iconList

    63420

    【Web APIs】DOM 文档对象模型 ③ ( 根据类名获取 DOM 元素 - getElementsByClassName 函数 | 代码示例 )

    DOM 元素 1、根据类名获取 DOM 元素 - getElementsByClassName 函数 根据类名获取 DOM 元素 , 需要 使用 HTML5 新增的方法 , Document.getElementsByClassName...函数获取 ; HTML5 必须是 IE9.0 以上的版本才能使用 ; 注意兼容性 : 如果要开发的网页需要兼容老版本的浏览器 , 如 : IE 678 版本 , 则不能使用该方法 ; Document.getElementsByClassName...函数 是 获取 文档中所有指定类名的 DOM 元素 , 得到的结果是 HTMLCollection 伪数组对象 , 其中封装了若干 Element 对象 ; var elements = document.getElementsByClassName...(className); Element.getElementsByClassName 函数 是 获取 Element 元素下的所有 指定类名的 DOM 元素 , 返回结果也是 HTMLCollection...文档中 指定类名的 DOM 元素 在下面的代码中 , 直接调用了 document.getElementsByClassName("box") 函数 , 可以获取整个网页中所有 类名为 'box' 的

    12410

    认识虚拟 DOM

    为什么需要虚拟 DOM? 为了弄明白为什么虚拟 DOM 这个概念会出现,让我们重新审视原始 DOM 。正如上面提到的,DOM 有两部分 —— HTML 文档的对象表示和一系列操作接口。 举个 : <!...为此,我们需要使用 DOM API 来查找我们想要更新的元素,创建新元素,添加属性和内容,然后最终更新 DOM 元素本身。...举例一些简单的方法,比如 document.getElementsByClassName() 可以小规模使用,但如果每秒更新很多元素,这非常消耗性能。...此副本可被频繁操作和更新,而无需使用 DOM API。一旦对虚拟 DOM 进行了所有更新,我们就可以查看需要对原始 DOM 进行哪些特定更改,最后以目标化和最优化的方式进行更改。...一旦收集了所有差异,我们就可以批量更改 DOM,并只做所需的更新。 例如,我们可以循环遍历每个差异,并根据 diff 指定的内容添加新的子代或更新旧的子代。

    65320

    JavaScript离别之作——HTML元素操作

    总结 除了document.getElementById()方法返回的是拥有指定id的元素外,其他方法返回的都是符合要求的一个集合。若要获取其中一个对象,可以通过下标的方式获取,默认从0开始。...document对象提供一些属性,可用于获取文档中的元素。例如,获取所有表单标签、图片标签等。 document对象的body属性用于返回body元素。...除此之外元素对象还提供了children属性用来获取指定元素的子元素。例如,获取上述示例中ul的子元素。...利用attributes属性可以获取一个HTML元素所有属性,以及所有属性的个数length。 举个例子 代码实现 <!...var tabs = document.getElementsByClassName('tab-head-div'); // 获取标签栏的所有内容对象 var divs = document.getElementsByClassName

    1.1K30

    Web API - DOM 第一节(获取元素

    通过DOM接口,可以改变网页的内容,结构和样式 DOM树 ---- 文档:一个页面就是一个文档,DOM中使用document表示 元素:页面中所有的标签都是元素,DOM中使用element表示 节点:网页中的所有内容都是节点...(标签,属性,文本,注释等),DOM中使用node表示 DOM把以上内容都看作对象 ---- 获取元素 如何获取页面元素 根据ID获取 根据标签名获取 用过H5新增的方法获取 特殊元素获取 根据ID获取...由于元素的 ID 在大部分情况下要求是独一无二的,这个方法自然而然成为了一个高效查找特定元素的方法。...document.getElementsByClassName('类名') document.getElementsByClassName('类名') //根据类名返回元素对象集合 实例: <p class...('选择器') 可以直接自动判断选择器类型, .类名为class选择器 #类名为id选择器 其它形式示例: 返回: ---- document.querySelectorAll() 返回指定选择器的所有元素对象集合

    78440

    Selenium自动化测试-JavaScript定位

    做自动化过程中,会发现有的按钮点击不了,或者点击没有反应,也没有报错,或者不能处理滚动条等场景,我们可以通过JavaScript定位来解决这些问题。...以下总结了5种JavaScript定位的方法,除了id是定位到单个element元素对象,其它的都是elements返回的是list对象。...1.通过id获取 document.getElementById(“id”) 2.通过name获取 document.getElementsByName(“Name”) 3.通过标签名选取元素...document.getElementsByTagName(“tag”) 4.通过CLASS类选取元素 document.getElementsByClassName(“class”) 5.通过...CSS选择器选取元素 document.querySelectorAll(“css selector") 通过JavaScript获取元素之后,对元素的属性、内容进行操作。

    2.4K20

    第87天:HTML5中新选择器querySelector的使用

    3.5+, Safari 3.2+, Opera 10.1+, IE 8+ 2、document.querySelectorAll("selector"); selector:根据CSS选择器返回所有匹配到的元素数组...("selector"); selector:根据类选择器返回所有匹配到的元素数组,如果没有匹配到,则返回空数组; 支持: Chrome 4.0+, FireFox 3.0+, Safari 3.2+,...(selector);//返回所有满足该条件的元素元素类型是dom的数组 $('.item');//返回一个jQuery对象(dom元素的数组) 本质上jQuery方式和querySelector方式都是获取...DOM数组,只不过jquery会多一些其他成员 DOM数组的每一个成员注册事件不能像jquery一样直接注册,必须分别给每个元素注册 html5就是将经常需要的操作又包装一层 实例: 1 <div class...(".content ul li"); (3)如果想要获得所有class为w3c的li元素,我们只需要:   document.getElementsByClassName("w3c");

    95830

    原创 今日webjs学习

    js含有 dom和bom 分别是对html元素操作和对浏览器操作 首先 js一般直接嵌套在 html中,用括起来. 其次可以在浏览器console中运行....2.通过class查找:var b = document.getElementsByClassName(“a”);,括号内为元素的class;如果在class名后面加上[0],则可找到其中第一个元素,...其次是对内容进行操作,即获取和修改: ​ 获取:例如var d = document.getElementById(“a”); ​ 要想获取元素内文本的内容,可输入alert(d.innerText);...,不过这种方式只能输入文本,样式不显示; ​ 如果要获取元素所有的内容,包含标签,则需要使用alert(d.innerHTML);。 ​...修改,会把原有的内容覆盖: ​ 修改元素里面的文本内容使用,例:d.innerText = “你好”;; ​ 修改元素内包括HTML代码在内的所有元素,例:d.innerHTML = “你好”;;

    25820

    前端性能优化之防抖与节流,大幅度降低你的事件处理性能

    为什么要用防抖和节流?...-- 此处省略很多div标签 --> window.onload = function () { // 获取导航栏标签元素 let nav_bar...,触发scroll 事件, 首先判断 timer 是否有定时器, 因为第一次滚动触发事件,并没有定时器赋值给timer, 所以执行下面的代码, 这时给 timer 赋值一个延迟为500ms的定时器,并将获取导航栏离文档顶部距离的代码放在定时器中..., 因为是第一次触发该事件,last = 0 ,所以 if 语句成立,获取一次导航栏离文档顶部的距离,并给 last 赋值一个现在的时间戳。...我们能很清楚的看到, 利用定时器节流的效果跟利用时间戳节流的效果差不多,如果非要说差别的话,就是利用时间戳节流,第一次滚动会立马获取一次数据,而利用定时器节流, 第一次获取数据会延迟一定时间。

    1.6K20

    从零写一个基于油猴脚本的 Google 辅助插件(文末附完整代码)

    我本人是一个重度快捷键用户,在使用 Google 的时候发现,只能点击而不能通过快捷键选中搜索结果。...比如这里我想看第二个搜索结果,那只能通过点击的方式,于是我就在想能不能通过一个简单的脚本给这些搜索结果绑定上快捷键呢?...1)打开 F12 ,可以发现所有的搜索结果带有特定的 class 属性LC20lb MBeuO DKV0Md。那我们就可以通过这个属性很轻易的获取到搜索结果。...let className = 'LC20lb MBeuO DKV0Md' document.getElementsByClassName(className) 但这个时候获取到的并不是数组结构,而是...还有一个问题,就是我们其实没有必要获取所有的搜索结果,比如我往下滑了几屏的高度,其实只需要获取到在当前屏幕内的就可以了。

    18000

    【译】理解 Virtual DOM

    为什么需要 Virtual dom 为了理解 Virtual DOM 的概念出现的原因,让我们重新审视 DOM。...我们需要使用 DOM API 来查找我们想要更新的元素,创建新元素,添加属性和内容,然后最终更新 DOM 元素本身。...诸如 document.getElementsByClassName()之类的简单方法可以在小范围内使用,但如果我们每隔几秒更新页面上的多个元素,那么不断查询和更新 DOM 会变得非常昂贵。...完成对 Virtual DOM 的所有更新后,我们可以查看需要对 DOM 进行哪些特定更改,并以优化后的目标方式进行更改。 Virtul DOM 长什么样?...但由于它是一个普通的 Javascript 对象,我们可以自由而频繁操作它,而不需要操作实际的DOM。

    1K20

    LeetCode 01两数之和&02两数相加

    但是,数组中同一个元素不能使用两遍。...(这种情况要先遍历一遍,n个元素都要) ? 如果遇到两个同元素就错误了,能不能又正确再简单一点? 答案是可以的,其实我们不需要用hash存储所有,边走边存即可。为什么我们可以这么考虑?...因为如果从数的特性来看: 数是一对形式出现的 一对有前后位置之分,在遍历到前的时候不一定会找到后面的元素,但是遍历到后面的元素前面一定被我们存储了。 ?...您可以假设除了数字 0 之外,这两个数都不会以 0 开头。...需要准确表示进位,并且最后要考虑以下进位 妥善返回正确节点,可以用一个头节点用来使得所有节点都正常操作,而不需要特殊判断。

    40520

    JavaScript 学习-28.元素与节点(HTMLCollection 和 NodeList)

    前言 我们平常说的查找元素 和 节点到底有什么区别?为什么有时候返回HTMLCollection ,有时候返回NodeList? HTMLCollection 和  NodeList 的区别又是什么?...节点与元素 根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点: 整个文档是一个文档节点 每个 HTML 元素元素节点 HTML 元素内的文本是文本节点 每个 HTML 属性是属性节点...NodeList 对象代表一个有顺序的节点列表 以下方法获取的为element 元素对象 document.getElementById(“id属性”) document.querySelector(‘...你可以像数组一样,使用索引来获取元素。 HTMLCollection 无法使用数组的方法:valueOf(), pop(), push(), 或 join() NodeList节点列表不是一个数组!...你可以像数组一样,使用索引来获取元素。 节点列表无法使用数组的方法:valueOf(), pop(), push(), 或 join() 。

    1.9K21
    领券