HTML5 引入的自定义数据属性(data-*)为开发者提供了一种将自定义数据嵌入HTML元素的标准方法。
这个特性使得在不使用非标准属性或额外的 DOM 属性的情况下,能够在 HTML 元素上存储额外信息。
自定义数据属性以 data-
为前缀,后面跟着自定义的属性名。例如:
<div id="user" data-id="1234" data-user="johndoe" data-date-of-birth="1980-01-01">John Doe</div>
这里,我们定义了三个自定义数据属性:data-id
、data-user
和 data-date-of-birth
。
自定义数据属性可以在任何 HTML 元素上定义:
<article
id="electriccars"
data-columns="3"
data-index-number="12314"
data-parent="cars">
...
</article>
可以使用 dataset
属性来访问元素的自定义数据:
const article = document.querySelector('#electriccars');
console.log(article.dataset.columns); // "3"
console.log(article.dataset.indexNumber); // "12314"
console.log(article.dataset.parent); // "cars"
注意:在 JavaScript 中,属性名会自动从 kebab-case 转换为 camelCase。
同样可以使用 dataset
来修改自定义数据属性:
article.dataset.columns = 5;
可以在 CSS 中使用属性选择器来基于自定义数据属性应用样式:
article[data-columns='3'] {
width: 400px;
}
article[data-columns='4'] {
width: 600px;
}
可以在自定义数据属性中存储 JSON 数据:
<div id="user-data" data-user='{"name":"John", "age":30, "city":"New York"}'></div>
在 JavaScript 中解析:
const userData = document.getElementById('user-data');
const user = JSON.parse(userData.dataset.user);
console.log(user.name); // "John"
自定义数据属性在事件委托中特别有用:
<ul id="user-list">
<li data-user-id="1" data-user-name="Alice">Alice</li>
<li data-user-id="2" data-user-name="Bob">Bob</li>
<li data-user-id="3" data-user-name="Charlie">Charlie</li>
</ul>
document.getElementById('user-list').addEventListener('click', function(e) {
if (e.target.tagName === 'LI') {
console.log('Clicked on user:', e.target.dataset.userName);
console.log('User ID:', e.target.dataset.userId);
}
});
自定义数据属性可用于存储动态内容加载所需的信息:
<button data-load-url="/api/users" data-target="#user-container">Load Users</button>
document.querySelector('button').addEventListener('click', function() {
const url = this.dataset.loadUrl;
const target = this.dataset.target;
// 使用 url 加载数据并更新 target 元素
});
data-user-id
而不是 data-userId
)。
以下是一个使用自定义数据属性创建简单交互式图表的例子:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>交互式图表</title>
<style>
.bar {
fill: steelblue;
cursor: pointer;
}
.bar:hover {
fill: brown;
}
</style>
</head>
<body>
<svg width="500" height="300">
<g id="chart">
<rect class="bar" x="0" y="0" width="50" height="200" data-value="200" data-category="A"></rect>
<rect class="bar" x="60" y="50" width="50" height="150" data-value="150" data-category="B"></rect>
<rect class="bar" x="120" y="100" width="50" height="100" data-value="100" data-category="C"></rect>
<rect class="bar" x="180" y="70" width="50" height="130" data-value="130" data-category="D"></rect>
<rect class="bar" x="240" y="120" width="50" height="80" data-value="80" data-category="E"></rect>
</g>
</svg>
<div id="info"></div>
<script>
document.getElementById('chart').addEventListener('click', function(e) {
if (e.target.classList.contains('bar')) {
const value = e.target.dataset.value;
const category = e.target.dataset.category;
document.getElementById('info').textContent = `类别 ${category}: ${value}`;
}
});
</script>
</body>
</html>
在这个例子中:
data-value
和 data-category
属性存储每个条形的数据。自定义数据属性在所有现代浏览器中都得到了很好的支持。然而,在使用 dataset
属性时,需要注意 IE 10 及以下版本不支持此属性。对于需要支持旧版浏览器的项目,可以使用 getAttribute
方法作为替代:
// 现代浏览器
const value = element.dataset.myValue;
// 兼容旧浏览器
const value = element.getAttribute('data-my-value');