html5
主页 > 网页 > html5 >

HTML5 data-*自定义数据属性的代码

2025-03-21 | 佚名 | 点击:

HTML5 引入的自定义数据属性(data-*)为开发者提供了一种将自定义数据嵌入HTML元素的标准方法。

这个特性使得在不使用非标准属性或额外的 DOM 属性的情况下,能够在 HTML 元素上存储额外信息。

基本概念

自定义数据属性以 data- 为前缀,后面跟着自定义的属性名。例如:

1

<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。

使用自定义数据属性

1. 在 HTML 中定义

自定义数据属性可以在任何 HTML 元素上定义:

1

2

3

4

5

6

7

<article

  id="electriccars"

  data-columns="3"

  data-index-number="12314"

  data-parent="cars">

  ...

</article>

2. 通过 JavaScript 访问

可以使用 dataset 属性来访问元素的自定义数据:

1

2

3

4

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。

3. 通过 JavaScript 修改

同样可以使用 dataset 来修改自定义数据属性:

1

article.dataset.columns = 5;

4. 在 CSS 中使用

可以在 CSS 中使用属性选择器来基于自定义数据属性应用样式:

1

2

3

4

5

6

article[data-columns='3'] {

  width: 400px;

}

article[data-columns='4'] {

  width: 600px;

}

高级用法

1. 存储 JSON 数据

可以在自定义数据属性中存储 JSON 数据:

1

<div id="user-data" data-user='{"name":"John", "age":30, "city":"New York"}'></div>

在 JavaScript 中解析:

1

2

3

const userData = document.getElementById('user-data');

const user = JSON.parse(userData.dataset.user);

console.log(user.name); // "John"

2. 事件委托

自定义数据属性在事件委托中特别有用:

1

2

3

4

5

<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>

1

2

3

4

5

6

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);

  }

});

3. 动态内容加载

自定义数据属性可用于存储动态内容加载所需的信息:

1

<button data-load-url="/api/users" data-target="#user-container">Load Users</button>

1

2

3

4

5

document.querySelector('button').addEventListener('click', function() {

  const url = this.dataset.loadUrl;

  const target = this.dataset.target;

  // 使用 url 加载数据并更新 target 元素

});

最佳实践

实际应用示例:交互式图表

以下是一个使用自定义数据属性创建简单交互式图表的例子:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

<!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>

在这个例子中:

浏览器兼容性

自定义数据属性在所有现代浏览器中都得到了很好的支持。然而,在使用 dataset 属性时,需要注意 IE 10 及以下版本不支持此属性。对于需要支持旧版浏览器的项目,可以使用 getAttribute 方法作为替代:

1

2

3

4

// 现代浏览器

const value = element.dataset.myValue;

// 兼容旧浏览器

const value = element.getAttribute('data-my-value');

原文链接:
相关文章
最新更新