基于 DOM 特性与属性教程:用 getAttribute 与 dataset 获取 data-* 自定义特性

发布时间:2026/10/8 1:27:23

基于 DOM 特性与属性教程:用 getAttribute 与 dataset 获取 data-* 自定义特性 文档教程前端【免费下载链接】zh.javascript.info现代 JavaScript 教程The Modern JavaScript Tutorial以最新的 ECMAScript 规范为基准通过简单但足够详细的内容为你讲解从基础到高阶的 JavaScript 相关知识。项目地址https://gitcode.com/gh_mirrors/zh/zh.javascript.info点击查看免费下载本文以《现代 JavaScript 教程中文版》中「特性和属性Attributes and properties」章节及其练习题「获取特性Get user attribute」为核心讲解 HTML 特性attribute与 DOM 属性property的区别、四类特性操作方法getAttribute/setAttribute/hasAttribute/removeAttribute以及专为自定义数据设计的data-*特性与dataset属性。读完本文你将能熟练地从文档中选取带data-widget-name等自定义特性的元素并读取其值也能理解为什么读取原始 HTML 值时应该使用getAttribute而非 DOM 属性。从一道练习题说起获取data-widget-name在本仓库的 1-get-user-attribute/task.md 中有一道重要度为 5最高的练习题编写代码从文档中获取带有data-widget-name特性的元素并读取它的值。题目给出的 HTML 骨架如下div>!DOCTYPE html html body div>body idtest somethingnon-standard script alert(document.body.id); // test alert(document.body.something); // undefined —— 非标准特性没有对应属性 /script /body还要注意「标准」是相对于元素类型而言的type对inputHTMLInputElement是标准特性因此input.type返回text但type对bodyHTMLBodyElement并非标准特性所以body.type是undefined。既然非标准特性没有对应的 DOM 属性如何访问它们答案就是本章介绍的四类特性操作 API。特性操作的四个方法get / set / has / remove所有特性都可以通过以下四个方法访问它们操作的实际上是 HTML 中的内容elem.hasAttribute(name)—— 检查特性是否存在elem.getAttribute(name)—— 获取特性值elem.setAttribute(name, value)—— 设置特性值elem.removeAttribute(name)—— 移除特性。此外elem.attributes返回一个内建Attr类的可迭代对象集合其中每个条目都有name和value属性包含元素的所有特性标准与非标准。文章中的扩展示例展示了这些 API 的完整行为body div idelem aboutElephant/div script alert( elem.getAttribute(About) ); // (1) Elephant读取特性名大小写不敏感 elem.setAttribute(Test, 123); // (2) 写入值会被转为字符串 123 alert( elem.outerHTML ); // (3) 特性在 HTML 中可见 for (let attr of elem.attributes) { // (4) 列出所有特性 alert( ${attr.name} ${attr.value} ); } /script /body需要记住的四个行为特征getAttribute(About)能读到aboutElephant的值因为特性名大小写不敏感任何值赋给特性后都会变成字符串所以123变成123通过setAttribute设置的特性会真实反映在outerHTML中attributes集合是可迭代的for...of即可遍历全部特性。属性—特性同步大多数情况双向value是例外当一个标准特性被改变对应的属性会自动更新反过来属性改变时特性通常也会同步除少数特例。本章用id演示了这种双向同步input script let input document.querySelector(input); // 特性 属性 input.setAttribute(id, id); alert(input.id); // id属性被更新了 // 属性 特性 input.id newId; alert(input.getAttribute(id)); // newId特性被更新了 /script但input.value是著名的例外它只能从特性同步到属性反向不行。input script let input document.querySelector(input); input.setAttribute(value, text); alert(input.value); // text特性 属性生效 input.value newValue; alert(input.getAttribute(value)); // text属性 特性不生效 /script这个「不对称」在实际开发中非常有用当用户修改了输入框内容导致value属性变化之后我们仍可从value特性中恢复 HTML 里写的「原始值」用于表单重置或脏值比对等场景。DOM 属性的多类型特征与href特例与特性「永远是字符串」不同DOM 属性的类型更丰富布尔型input.checked是布尔值。对input idinput typecheckbox checkedinput.getAttribute(checked)返回空字符串特性只表示「存在」而input.checked是true对象型style特性是字符串color:red;font-size:120%而style属性是CSSStyleDeclaration对象div.style.color返回red字符串但经过加工href属性始终返回完整的 URL即使特性里写的是相对路径或#hasha ida href#hellolink/a script alert(a.getAttribute(href)); // #helloHTML 中原始写法 alert(a.href); // http://site.com/page#hello完整 URL /script这就是本仓库配套练习题 2-yellow-links/solution.md 特意强调「用link.getAttribute(href)而不是link.href」的原因——外部链接判断需要的是 HTML 中写下的原始值。该题在 solution.view/index.html 中给出了可直接运行的完整页面。非标准特性与data-*为什么自定义数据要用dataset非标准特性的典型用途是把自定义数据从 HTML 传递到 JavaScript或为元素打上「标记」。本章展示了两种场景场景一标记元素并填充数据!-- 标记这个 div 以在这显示 name -- div show-infoname/div !-- 标记这个 div 以在这显示 age -- div show-infoage/div script let user { name: Pete, age: 25 }; for(let div of document.querySelectorAll([show-info])) { let field div.getAttribute(show-info); div.innerHTML user[field]; // 先显示 Pete再显示 25 } /script场景二用特性值驱动样式。与写死多个样式类.order-state-new、.order-state-pending、.order-state-canceled相比用特性管理状态更简单——只需一行div.setAttribute(order-state, canceled)即可切换状态无需增删类名。然而随意使用自定义特性存在风险HTML 语言在持续演进你今天用的非标准特性未来可能被标准采用并赋予新的含义从而产生意料之外的影响。为避免冲突规范保留了data-*特性专供程序员使用并配套提供dataset属性所有以data-开头的特性均被保留供程序员使用它们可以在dataset属性中访问。映射规则简单而直观data-about→elem.dataset.about多词特性data-order-state→ 驼峰式elem.dataset.orderState连字符被移除后续单词首字母大写。本章用订单状态示例演示了完整读写闭环style .order[data-order-statenew] { color: green; } .order[data-order-statepending] { color: blue; } .order[data-order-statecanceled] { color: red; } /style div idorder classorder>let links document.querySelectorAll(a); for (let link of links) { let href link.getAttribute(href); // 必须用 getAttribute而不是 link.href if (!href) continue; // 没有特性 if (!href.includes(://)) continue; // 没有协议 if (href.startsWith(http://internal.com)) continue; // 内部链接 link.style.color orange; }方案二纯 CSS 选择器一步到位let selector a[href*://]:not([href^http://internal.com]); let links document.querySelectorAll(selector); links.forEach(link link.style.color orange);方案一强调link.getAttribute(href)与link.href的差异前者返回 HTML 原文后者返回完整 URL方案二展示了特性选择器[href*://]包含匹配、:not([href^...])排除匹配与querySelectorAll的组合威力。两题放在一起正好覆盖了「定位带特定特性的元素」与「读取/修改特性值」这两大主题。总结何时该用属性何时该用特性本章article.md给出的最终结论非常明确特性attribute—— 写在 HTML 中的内容名字大小写不敏感值永远是字符串属性property—— DOM 对象中的内容名字大小写敏感值类型任意。在大多数情况下优先使用 DOM 属性。只有以下两类需求才回头使用特性需要非标准的特性——但如果它以data-开头应改用dataset属性想读取 HTML 中「所写」的原始值——因为对应 DOM 属性可能已被加工比如href属性永远是完整 URL而getAttribute(href)返回 HTML 原文。开头的练习题虽然只有几行代码却浓缩了本章的精华querySelector([data-widget-name])定位元素、dataset.widgetName/getAttribute(data-widget-name)读取值一套组合拳即可安全、可靠地完成「HTML 传数据给 JavaScript」的任务。赞分享文档教程前端【免费下载链接】zh.javascript.info现代 JavaScript 教程The Modern JavaScript Tutorial以最新的 ECMAScript 规范为基准通过简单但足够详细的内容为你讲解从基础到高阶的 JavaScript 相关知识。项目地址https://gitcode.com/gh_mirrors/zh/zh.javascript.info点击查看免费下载相关推荐从 DOM 读取>从 DOM 读取 data widget name 自定义属性getAttribute 与 dataset 完整指南 在现代 JavaScript 教程Mo文档/教程前端一文读懂Taiwan-LLM-7B-v2.1-chat的训练超参数学习率5e-05如何影响模型表现一文读懂Taiwan LLM 7B v2.1 chat的训练超参数学习率5e 05如何影响模型表现 Taiwan LLM 7B v2.1 chat作为一款专为使用>使用 data 属性与 dataset 读取元素自定义数据get user attribute 实战详解 本篇文章围绕 javascript.info 教程中文档/教程前端上一篇如何快速实现Firefox透明主题打造玻璃质感界面的完整指南下一篇SVGOMG浏览器兼容性终极指南跨平台适配解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/8 1:27:23

如何构建高性能多进程调试器:RAD Debugger的终极架构解析

如何构建高性能多进程调试器:RAD Debugger的终极架构解析 【免费下载链接】raddebugger A native, user-mode, multi-process, graphical debugger. 项目地址: https://gitcode.com/GitHub_Trending/ra/raddebugger RAD Debugger是一款原生、用户模式的多进程…

2026/10/8 2:32:31

Cursor 2.4.21 实测:免费额度、中文设置与多工具配合实战

最近不少朋友在问,我一直在用的 Cursor 更新到 2.4.21 之后到底怎么样,网上那些“免费无线续杯”的说法又是什么意思。这波热度确实高,毕竟 AI 编程工具已经成了很多人的日常生产力,而 Cursor 又是其中最受关注的一个。这篇文章就…

2026/10/8 2:32:31

Python程序员必会的Linux高频命令实战清单

每天打开终端顺手敲几条 Linux 命令,已经是很多 Python 程序员的工作常态。你写代码时的 IDE 是图形界面,可真到项目上线、数据迁移、日志排查、容器部署这些环节,鼠标基本帮不上忙,真正解决问题的还是那一行行命令。我见到不少 P…

2026/10/8 2:32:31

计算机网络期末复习:从试卷结构到高频考点与答题模板

简介:肇庆学院计算机网络期末考试试卷是面向计算机专业本科生及网络课程学员的复习自测资料,内容紧扣TCP/IP模型、数据传输、网络协议与网络架构等核心知识点,能够帮助学习者系统梳理计算机网络的基本原理,掌握网络地址分配、数据…

2026/10/8 2:32:31

滑动窗口进阶:如何高效统计“恰好包含K个不同整数”的子数组

滑动窗口这个专题里,“恰好包含 K 个不同整数”的计数题一直很有迷惑性。我第一次在训练列表里看到第3859题时,直接按照“窗口内不同数字个数等于 K 就计数”的思路去写,结果示例过了,一提交就挂在边界用例上。后来老老实实把问题…

2026/10/8 2:32:31

有序单链表合并全解析:从哨兵结点到AcWing3639实战

刷AcWing题库走到链表这一块的时候,第3639题“链表合并”绝对值得你停下来认真写一遍。我在拿到这道题的时候,第一反应是“这不就是归并两个有序数组换了个壳子嘛”,但真动手写,发现指针操作里藏了不少细节。合并两个有序单链表可…

2026/10/8 2:27:31

SpringBoot+Vue3智能学习平台全栈实战:从数据库设计到部署上线

写这篇博文之前,我先交代一下背景:前前后后折腾了两周,把一个从零开始搭的“智能学习平台”系统做到了能跑、能看、能用的状态。技术栈就是标题里那套——Java SpringBoot Vue3 MyBatis MySQL,前后端完全分离,源码级…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/7 8:18:33

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/6 17:46:51

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 0:02:17

自然数立方等于连续奇数之和:从证明到编程验证

十几年来我一直游走在数学科普和编程教学这两块内容之间,对“看起来像魔法、拆开全是数学”的结论总是格外敏感。最近翻资料时又撞见一句话:任何一个自然数 m 的立方,都可以写成 m 个连续奇数之和。2 的立方等于 3 加 5,3 的立方等…

2026/10/8 0:02:17

C#上位机SSH连接实战:用SSH.NET补齐超时、批量与密钥认证

简介:这是一份基于 C# 开发的 SSH 连接功能半成品工程,原本作为另一个主项目的子功能模块,现独立打包分享。工程采用 WinForms 界面,包含源码、解决方案、安装部署工程、NuGet 依赖包及说明文档,适合正在做远程连接、网…

2026/10/8 0:02:17

Java SpringBoot一体化智能售后系统设计与实现全解析

毕业设计年年做,Java Web 方向的题目翻来覆去就那么几个,但“一体化智能售后系统”这个题,每次看到我都觉得值得认真聊一聊。它不是一个简单 curd 堆出来的管理系统,而是把客户、工单、派单、处理、回访、统计整条链路串起来的一套…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑