← jQuery children()方法详解:如何精准获取直接子元素 jQuery each()方法:遍历匹配元素集的利器 →

jQuery data()方法:在元素上安全地存取自定义数据

原创 2026-05-01 jQuery 已有人查阅

在开发交互功能时,我们经常需要把一些数据和特定的 DOM 元素关联起来——比如记录一个按钮的点击次数、存储某条记录的 ID,或者保存一个组件的状态。jQuery 提供的 data() 方是为这个需求而设计的,它能让你在不污染 HTML 结构的情况下,将自定义数据绑定到任意元素上,并且随时可以读取。

data() 方法的核心价值在于内存级的数据关联。它与 attr() 不同,data() 操作的是 jQuery 内部的数据缓存对象,而非直接读写 HTML 的 data-* 属性。这意味着你可以存储任意 JavaScript 数据类型——字符串、数字、数组、对象——而不必把它们序列化成字符串再塞进属性里。当你需要移除这些数据时,可以使用 removeData() 方法进行清理。

为什么我更倾向于用 data() 而不是 attr() 存储自定义数据?

早期我习惯用 attr('data-xxx', value) 来绑定数据,但很快就发现了两个痛点。第一,attr() 只能存储字符串,存个对象还得用 JSON.stringify(),取出来再 JSON.parse(),繁琐且容易出错。第二,频繁读写 DOM 属性本身是有性能成本的,尤其是在循环操作中。data() 把数据放在内存里,读写更快,类型也保持原样。除非你需要让数据在 HTML 标记中可见,否则 data() 是更高效的选择。

语法详解

data() 方法有两种常用形式,职责分明:一种是读,一种是写。

读取数据

$(selector).data(name)

参数 name 是可选的,表示要读取的数据名称。如果传入 name,方法返回该名称对应的数据值;如果省略 name,方返回元素上所有已存储数据的对象。当指定名称的数据不存在时,返回值是 undefined

写入数据

$(selector).data(name, value)

这里的 name 和 value 都是必需参数。name 是数据的键名,value 是数据的值。值可以是任意 JavaScript 类型,包括对象和函数。这种灵活性让 data() 成为组件状态管理的便利工具。

课程知识要点

  • 内存缓存机制data() 将数据存储在 jQuery 的内部缓存中,不会直接修改 DOM 属性,读写性能更好。

  • 类型保持:存储对象时无需序列化,取出时类型保持不变,这一点比 attr() 在处理复杂数据时更有优势。

  • 不存在返回 undefined:读取不存在的键时返回 undefined,这与访问对象不存在的属性行为一致,便于做判断。

  • 数据清理:使用 removeData(name) 可以删除指定键的数据,不传参数则清除所有数据,避免内存中残留无用数据。

  • **HTML5 data-* 属性兼容**:data() 在首次读取时会尝试从元素的 data-* 属性中获取初始值,但后续写入操作不会写回属性,这是容易混淆的地方。

示例:为元素绑定和读取数据

下面这个示例模拟了一个常见的场景:点击按钮为页面上的信息面板绑定用户数据,之后可以随时读取并显示。注意观察在绑定数据前后点击“读取数据”按钮时,返回结果的区别。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>data() 方法示例 · 编程学习</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <style>
        .info-panel {
            padding: 15px;
            background-color: #e8f0fe;
            font-size: 22px;
            width: 380px;
            border-radius: 6px;
            margin-bottom: 15px;
        }
    </style>
</head>
<body>
    <h4>jQuery data() 方法操作演示</h4>
    <div class="info-panel">这是一个信息展示面板。</div>
    <p>请按顺序操作,观察数据状态的变化:</p>
    <button id="btn-attach">绑定数据</button>
    <button id="btn-get">读取数据</button>

    <script>
        $(document).ready(function () {
            // 绑定数据按钮
            $("#btn-attach").click(function () {
                $("div.info-panel").data("user", {
                    nickname: "编程学员",
                    level: 5,
                    email: "alan@ebingou.cn"
                });
                alert("数据已绑定到面板元素");
            });

            // 读取数据按钮
            $("#btn-get").click(function () {
                var storedData = $("div.info-panel").data("user");
                if (storedData === undefined) {
                    alert("当前没有数据,请先点击“绑定数据”按钮。");
                } else {
                    alert("读取成功: " + storedData.nickname + ",等级 " + storedData.level);
                    $("div.info-panel").text(
                        "用户: " + storedData.nickname + " | 等级: " + storedData.level
                    );
                }
            });
        });
    </script>
</body>
</html>

在这个例子中,数据是以对象形式存储的,包含昵称、等级和邮箱。data() 直接接收并完整保留了这个对象结构,读取时可以直接访问其属性,不需要任何解析步骤。如果你试试把同样的对象用 attr() 存储,很快就能体会到两者在便利性上的差异。

个人经验与实用建议

在日常开发中,我有一条自己的小原则:数据如果不需要在 HTML 标记里被直接看到,就用 data() 处理。 比如表单验证的状态、分页组件的当前页码、拖拽操作的起始坐标等,这些中间态数据很适合放在内存缓存里,用完清理即可。

另外要注意一个容易踩的坑:data() 读取 data-* 属性时有一套自动类型转换规则。比如 data-user-id="123" 会被自动转成数字 123data-active="true" 则会变成布尔值 true。但如果你用 attr('data-active') 去读,拿到的是字符串 "true"。这个差异在条件判断时可能引发意外结果,所以保持存取方式的一致性很重要。

当你需要彻底销毁某个元素时,建议先调用 removeData() 清理关联数据,尤其是在单页应用中,这能避免内存中残留无效引用,属于良好的编码习惯。

← jQuery children()方法详解:如何精准获取直接子元素 jQuery each()方法:遍历匹配元素集的利器 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号