直接用 querySelectorAll 选中元素并配合 setAttribute 批量写入 data-* 属性是唯一真正更新 DOM 的方式;dataset 是只读映射,赋值不触发 DOM 更新,且与 setAttribute 混用会导致缓存不一致。

直接用 document.querySelectorAll() 选中元素,再配合 setAttribute() 批量写入 —— 这是唯一能真正更新 DOM 中 data-* 属性的方式。
为什么 dataset.xxx = 'val' 不生效
dataset 是只读映射,赋值操作(如 el.dataset.userId = "789")只改了 JS 内存里的副本,不会写入 HTML 属性节点,getAttribute("data-user-id") 仍返回旧值,CSS 选择器(如 [data-user-id="789"])也匹配不到。
- 真正写入 DOM 的唯一方法是
el.setAttribute("data-user-id", "789") -
dataset适合读取 + 快速访问,不适合写入 - 混用会出问题:先
dataset.foo = "a",再setAttribute("data-foo", "b"),后续dataset.foo仍返回"a"(缓存未刷新)
批量设置必须用 querySelectorAll + 静态 NodeList
别用 getElementsByClassName 或 getElementsByTagName,它们返回实时集合(live collection),循环中增删 class 可能导致漏项或重复遍历。
把任意文章或文档内容转换成精美的全屏翻页 HTML 演示文件(幻灯片风格)。当用户发来一篇文章、文档链接、Markdown 内容、或粘贴的文本,并且希望生成演示用的 HTML 时触发。支持任意内容来源:iWiki 链接、KM 链接、本地文件路径、直接粘贴的文本。生成的 HTML 文件保存到本地工作区,并通过企微直接发送给用户。触发词示例:帮我把这篇文章做成PPT、转成演示文档、生成HTML幻灯片、做个演示、转成可以演示的格式、article to deck、make a slide。
- 正确写法:
document.querySelectorAll('.item[data-status="pending"]'),一次筛选、返回静态 NodeList - NodeList 不支持
forEach(IE 和旧 Safari 报错),得转数组:Array.from(...).forEach(...)或[...document.querySelectorAll(...)].forEach(...) - 避免在循环里反复调用
querySelectorAll或getElementById,性能极差
按组批量设 data-index 的典型场景
比如每 3 个元素共享一个递增的 data-index 值(3、3、3、6、6、6…),核心是把零起点索引 i 映射为分组号:Math.floor(i / 3),再换算成目标值。
- 示例代码:
const items = document.querySelectorAll('.item'); Array.from(items).forEach((el, i) => { const groupIndex = Math.floor(i / 3); const value = 3 + groupIndex * 3; el.setAttribute('data-index', value); }); - 不要用 jQuery 的
.data()方法写入 —— 它只存 JS 缓存,不写 DOM;要用.attr('data-index', value) - 若元素动态插入,必须在插入 DOM 后立即执行该逻辑,不能依赖初始加载时的一次性脚本
最常被忽略的是:所有 data-* 值在 DOM 中永远是字符串,哪怕你写 data-count="42",读出来仍是 "42";后续做数值计算或布尔判断时,必须手动转换类型,否则 dataset.count + 1 得到的是 "421",不是 43。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










