HTML5 data-* 自定义属性

本文介绍HTML5中data-*属性的使用方法及其优势,包括直接在HTML元素上设置和通过JavaScript操作的方式,并对比getAttribute/setAttribute的区别。此外,还讨论了data-*属性的浏览器兼容性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

jQuery的attr与prop提到过在IE9之前版本中如果使用property不当会造成内存泄露问题,而且关于Attribute和Property的区别也让人十分头痛,在HTML5中添加了data-*的方式来自定义属性,所谓data-*实际上上就是data-前缀加上自定义的属性名,使用这样的结构可以进行数据存放。使用data-*可以解决自定义属性混乱无管理的现状。

读写方式

data-*有两种设置方式,可以直接在HTML元素标签上书写

<div id="test" data-age="24">
        Click Here
    </div>

其中的data-age就是一种自定义属性,当然我们也可以通过JavaScript来对其进行操作,HTML5中元素都会有一个dataset的属性,这是一个DOMStringMap类型的键值对集合

var test = document.getElementById('test');
        test.dataset.my = 'Byron';

这样就为div添加了一个data-my的自定义属性,使用JavaScript操作dataset有两个需要注意的地方

1. 我们在添加或读取属性的时候需要去掉前缀data-*,像上面的例子我们没有使用test.dataset.data-my = 'Byron';的形式。

2. 如果属性名称中还包含连字符(-),需要转成驼峰命名方式,但如果在CSS中使用选择器,我们需要使用连字符格式

为刚才代码追加写内容

复制代码
<style type="text/css">
        [data-birth-date]
        {
            background-color: #0f0;
            width:100px;
            margin:20px;
        }
    </style>
复制代码
test.dataset.birthDate = '19890615';

这样我们通过JavaScript设置了data-birth-date自定义属性,在CSS样式表为div添加了一些样式,看看效果

image

image

读取的时候也是通过dataset对象,使用”.”来获取属性,同样需要去掉data-前缀,连字符需要转化为驼峰命名

复制代码
var test = document.getElementById('test');
        test.dataset.my = 'Byron';
        test.dataset.birthDate = '19890615';
        test.onclick = function () {
            alert(this.dataset.my + ' ' + this.dataset.age+' '+this.dataset.birthDate);
        }
复制代码

image

getAttribute/setAttribute

有些同学可能会问这和getAttribute/setAttribute除了命名有什么区别吗,我们来看一下

复制代码
var test = document.getElementById('test');
        test.dataset.birthDate = '19890615';
        test.setAttribute('age', 25);
        test.setAttribute('data-sex', 'male');

        console.log(test.getAttribute('data-age')); //24
        console.log(test.getAttribute('data-birth-date')); //19890516
        console.log(test.dataset.age); //24
        console.log(test.dataset.sex); //male
复制代码

image

image

这样我们可以看出,两者都把属性设置到了attribute上(废话,要不人家能叫自定义属性),也就是说getAttribute/setAttribute可以操作所有的dataset内容,dataset内容只是attribute的一个子集,特殊就特殊在命名上了,但是dataset内只有带有data-前缀的属性(没有age=25那个)。

那么为什么我们还要用data-*呢,一个最大的好处是我们可以把所有自定义属性在dataset对象中统一管理,遍历啊神马的都哦很方便,而不至于零零散散了,所以用用还是不错的。

浏览器兼容性

比较不好的消息就是data-*的浏览器兼容性情况十分不乐观

  • Internet Explorer 11+
  • Chrome 8+
  • Firefox 6.0+
  • Opera 11.10+
  • Safari 6+

其中IE11+简直就是亮瞎小伙伴的眼,看来要想全面使用此属性路漫漫其修远矣

<think>好的,我现在要回答用户关于微信小程序开发中data-*自定义属性和模块引用的问题。首先,我需要回忆一下相关的知识点,并结合提供的引用内容来确保回答的准确性。 用户提到data-*自定义属性,我记得在小程序中,可以通过在组件标签上使用data-xxx来绑定数据,然后在事件处理函数中通过事件对象获取。需要确认具体的使用步骤,比如如何设置和获取这些属性。根据引用[3],用户可能已经看过组件中类名的定义,但这里需要关注的是data-*属性,可能需要结合事件处理来讲解。 然后是模块引用,也就是如何使用require或import来引入外部JS模块。需要说明模块的定义和导出方式,以及如何在其他文件中引入使用。引用[4]提到npm构建的问题,但用户的问题可能更多是关于代码模块化,而不是npm包,所以可能不需要涉及构建配置,除非用户的问题涉及到。 接下来,我需要检查提供的引用内容是否有相关内容。引用[1]提到安装类型定义库,引用[2]介绍纯数据字段,引用[3]是组件类名的例子,引用[4]是npm构建的问题。可能引用[2]中的纯数据字段和data-*属性相关,但需要区分开,data-*是用于传递数据到事件处理,而纯数据字段是不参与渲染的数据。所以需要明确两者的不同,避免混淆。 现在,我需要组织回答的结构: 1. 先解释data-*自定义属性的使用方法,包括如何设置、如何获取,可能结合wxml中的例子和js中的事件处理函数。 2. 然后讲解模块引用的方法,如何导出模块,如何引入,可能给出一个简单的例子,比如工具函数模块。 3. 结合引用内容,可能需要提到引用[2]中的纯数据字段,但需要指出两者的区别,避免用户混淆。 4. 最后生成相关问题,确保覆盖用户可能进一步提问的方向,比如性能优化、数据传递的其他方法等。 需要注意使用正确的格式,行内公式用$...$,但在这个问题中可能不太涉及数学公式,但需要遵循其他格式要求,比如代码块用反引号,引用标识放在相关段落末尾。例如,在讲解模块引用时,如果提到纯数据字段,可以引用[2]。 同时,用户的问题中提到了“引用模块”,可能包括两种:自定义JS模块和npm模块。根据引用[1],如果使用npm安装的模块,可能需要配置构建,但用户的问题可能更基础,所以先讲自定义模块的引用,再简要提及npm模块可能需要构建步骤,如引用[4]提到的配置问题。 现在开始组织内容: 第一部分:data-*自定义属性 - 在WXML中设置data-属性,比如data-id="{{id}}" - 在事件处理函数中,通过e.currentTarget.dataset.id获取 - 注意:属性名会被转换为驼峰式,例如data-user-id变成userId - 举例说明,可能用点击事件,如bindtap,然后在js中获取数据 第二部分:模块引用 - 使用module.exports或exports导出函数、对象等 - 在需要的地方使用require(path)引入 - 例如,创建一个util.js模块,导出函数,然后在其他js文件中引入使用 - 如果使用npm模块,需要构建npm,但引用[4]提到项目结构问题,可能需要调整miniprogramRoot 第三部分:可能的相关问题 - data-属性与纯数据字段的区别(引用[2]) - 模块化开发的最佳实践 - 如何处理npm模块的安装和构建问题(引用[1]和[4]) 最后生成相关问题,比如如何传递复杂数据、模块化封装技巧、npm构建问题等。 需要确保回答正确,没有错误。例如,data-属性的获取是否正确,模块导出的语法是否正确,是否提到转换驼峰命名的问题。同时,引用相关引用内容,比如在讲解模块引用时,提到npm构建问题可以参考引用[4],或者在讲解纯数据字段时引用[2]。</think>### 微信小程序 data-* 自定义属性与模块引用开发教程 #### 一、data-* 自定义属性 **data-*** 是小程序中用于在组件上绑定自定义数据的属性,常用于事件传递参数。 1. **设置 data-* 属性** 在 WXML 组件标签中,通过 `data-属性名` 绑定动态或静态值: ```html <view bindtap="onClick" data-id="123" data-user-info="{{ {name: 'Alice'} }}">点击传递数据</view> ``` 2. **获取 data-* 属性** 在事件处理函数中,通过 `event.currentTarget.dataset` 获取属性值,属性名会自动转换为**驼峰格式**: ```javascript Page({ onClick(e) { const id = e.currentTarget.dataset.id; // "123" const userInfo = e.currentTarget.dataset.userInfo; // {name: 'Alice'} } }) ``` > 注意:若属性名为 `data-user-id`,则获取时需用 `datasetId`[^3]。 #### 二、模块引用方法 小程序支持通过 `require` 或 ES6 的 `import` 引入外部 JS 模块。 1. **定义模块** 在 `utils/util.js` 中编写工具函数并导出: ```javascript function formatTime(date) { return date.toLocaleString(); } module.exports = { formatTime }; // CommonJS 导出 ``` 2. **引用模块** 在页面或组件的 JS 文件中引入并使用: ```javascript const util = require('../../utils/util.js'); // 相对路径 Page({ onLoad() { const time = util.formatTime(new Date()); } }) ``` 3. **npm 模块支持** 若使用 npm 包(如 `miniprogram-api-typings`),需先在项目根目录执行构建: ```bash npm install -D miniprogram-api-typings ``` 并在开发者工具中点击 **工具 > 构建 npm**,确保 `miniprogramRoot` 配置正确[^4]。 #### 三、注意事项 - **纯数据字段**:若数据仅用于逻辑处理且不参与渲染,可声明为 `pureDataPattern`(如 `_internalValue`),提升性能[^2]。 - **data-* 限制**属性值需为字符串或可序列化对象,避免传递复杂函数。 --- §§ 1. 如何在小程序中传递对象或数组类型的 data-* 属性? 2. 模块引用时如何处理循环依赖问题? 3. 纯数据字段与 data-* 属性的核心区别是什么? 4. npm 构建失败常见原因有哪些?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值