HTML5 data-* 自定义属性操作及其注意点
在HTML5中添加了data-*的方式来自定义属性,所谓data-*实际上上就是data-前缀加上自定义的属性名,命名可以用驼峰命名方式,但取值是必需全部使用小写(后面会说),使用这样的结构可以进行数据存放。使用data-*可以解决自定义属性混乱无管理的现状。
1. Html绑定数据写法
1.1简单单词:
<div id="testDiv" data-cd="24">
Click Here
</div>
1.2 使用驼峰命名(需要特定注意的地方):
<div id="testDiv" data-cartCd="24">
Click Here
</div>
2. 取绑定的值方法
原生的js取法:
var testDiv = document.getElementById('testDiv');
简单的单词:console.log(testDiv.dataset.cd);
复杂的驼峰命名单词:console.log(testDiv.dataset.cartcd);//注意是“cartcd”,不管
//是不是驼峰命名,一切都是小些。
使用Jquery方法:
console.log($(“#testDiv”).data(“cd”));
console.log($(“testDiv”).data(“cartcd”));//同上面一样,注意是“cartcd”,不管
//是不是驼峰命名,一切都是小些。
和html5的api不同的是,jQuery会尝试将字符串转换为一个JavaScript值(包括布尔值(booleans),数字(numbers),对象(objects),数组(arrays)和空(null))。
3. 修改绑定数据
原生js方式:
testDiv.dataset.cartcd= “新值”
Jquery方式:
$(“testDiv”).data(“cartcd”,”新值”)
其实这个属性是html5新加的特性,为了绑定数据,我们可以将一些参数绑定到dom标签上,而不用将数据填 到input标签上然后隐藏该标签。最需要注意的一点的取值时必需全部使用小写的名字,”data-*”中名子可以用驼峰命名。
- <div id="testDiv" data-cname="张三" data-e-name="zhangsan" data-myName="my name is zs.">测试在元素上存储一个key-value</div>
- $(document).ready(function(){
- var el = document.getElementById("testDiv");
- console.log(el.dataset.cname);//=>张三
- el.dataset.cname = "ZS";//设置值为"ZS"
- console.log(el.dataset.cname);//=>"ZS"
- console.log("jQuery data:", $("#testDiv").data("eName") );
- $("#testDiv").data("eName", "abcefg");
- console.log("jQuery data:", $("#testDiv").data("eName") );
- console.log("遍历testDiv上的自有属性");
- $.each(el.dataset, function(key, value){
- console.log(key+":"+value);
- });
- //遍历testDiv上的自有属性
- //cname:ZS
- //eName:zhangsan
- //myname:my name is zs.
- <span style="white-space:pre"> </span>
- });
在获取自定义属性的值时,使用dataset属性,然后通过自定义属性(这时去掉data-前缀)的名称去获取值。dataset是JS5规范中新增加的属性,用于和data-*配合使用。
通过each打印的结果,我们需要注意:
jQuery中的.data()
- <script id="jquery_183" type="text/javascript" class="library" src="//cdn.bootcss.com/jquery/2.2.0/jquery.js"></script>
- <!DOCTYPE html>
- <html>
- <head>
- </head>
- <body>
- <div id="testDiv" data-cname="张三" data-e-name="zhangsan" data-myName="my name is zs.">
- 测试在元素上存储一个key-value
- </div>
- </body>
- </html>
- $(function(){
- function printVlaue(){
- //通过data()在testDiv元素上存储 {ename:zhangsan} 健/值对。
- $("#testDiv").data("ename", "zhangsan");
- //修改data()通过 data-* 属性存储的值
- $("#testDiv").data("cname", "我是张三");
- console.log( "获取通过data()存储在testDiv元素上的ename值:", $("#testDiv").data("ename") );
- console.log( "获取通过 data-* 存储在testDiv元素上的cname值:", $("#testDiv").data("cname") );
- //$("#testDiv").jQueryremoveAttr("data-"+"abc");
- console.log( "获取ename值:", $("#testDiv").data("ename") );
- console.log( "获取cname值:", $("#testDiv").data("cname") )
- console.log("删除testDiv元素上 ename 和 cname 键/值对。");
- $("#testDiv").removeData("ename");
- $("#testDiv").removeData("cname");
- console.log("输出 eanem 和 canme 对应的值,看是否已经删除");
- console.log( $("#testDiv").data("ename") );
- console.log( $("#testDiv").data("cname") );
- };
- $("<button>获取值</button>").appendTo("body").bind("click", printVlaue);;
- console.log("debug use.");;
- });
- /*
- 获取通过data()存储在testDiv元素上的ename值: zhangsan
- 获取通过 data-* 存储在testDiv元素上的cname值: 我是张三
- 获取ename值: zhangsan
- 获取cname值: 我是张三
- 删除testDiv元素上 ename 和 cname 键/值对。
- 输出 eanem 和 canme 对应的值,看是否已经删除
- undefined
- 张三
- */
从上例中我们可以看出,.data()可以获取通过data-*属性存储的值。但是通过.data()修改data-*属性的值不会显示在HTML标记中,我们只是通过.data()在元素存储了一个新值。.removeData()也不能删除通过data-*存储的数据。由于jQuery是一个通用的JS框架,最浏览器兼容性做的非常好,大多数情况,我们应该通过.data()在元素上存取数据(有一个好处是可以存储一个对象)。如果我们必须通过data-*来存取和修改数据,建议使用JS5的dataset属性,这个属性的兼容问题,我们可以通过写jQuery插件来解决。这是我的插件代码,如下:
- <script id="jquery_183" type="text/javascript" class="library"
- src="//cdn.bootcss.com/jquery/2.2.0/jquery.js"></script>
- <!DOCTYPE html>
- <html>
- <head>
- </head>
- <body>
- <div id="testDiv" data-cname="张三" data-e-nAme="zhangsan" data-myName="my name is zs.">
- 测试在元素上存储一个key-value
- </div>
- </body>
- </html>
- $(document).ready(function(){
- function printValue(){
- var $testDiv = $("#testDiv").udDataAttr();
- console.log("udDataAttr get()=>", $testDiv.get("cname") );
- $testDiv.set("cname", "set 张三");
- console.log("udDataAttr get()=>", $testDiv.get("cname") );
- console.log("打印所有已data-*开头的属性和值=>", $testDiv.dataset());
- console.log("udDataAttr get e-name=>", $testDiv.get("e-name") );
- //var el = document.getElementById("testDiv");
- //console.log("el.dataset.eName=>", el.dataset.eName);
- };
- $("<button>获取值</button>").appendTo("body").bind("click", printValue);
- console.log("debug use.");
- });
- (function($, window){
- //user-defined Attribute
- var plugName = "udDataAttr";
- $.fn[plugName] = function(){
- var $self = $(this),
- obj = ($self.length && $self[0].dataset) || null;
- return {
- get: function(name){
- return obj===null? $self.attr("data-"+name) : obj[ this._format(name) ];
- }
- ,set: function(name, value){
- if(obj === null){
- $self.attr("data-"+name, value);
- }else{
- obj[ this._format(name) ] = value;
- }
- return $self;
- }
- ,dataset: function(){
- var newObj = {};
- if(obj === null){
- $.each(obj, function(key, value){
- newObj[key] = value;
- });
- }else{
- newObj = $self.data(); //获取所有以data-*开头的属性
- }
- return newObj;
- }
- /*
- * 将name转换成dataset可识别的格式。
- * 例如:e-name 转换成 eName
- * 总感觉 _format()的实现不是最优的,求高手给出实现
- */
- ,_format: function(name){
- console.log("_format old name=>",name);
- name = name.toLowerCase();
- if(name.indexOf('-')>-1){
- var array = name.split('-');
- for(var i=1,len=array.length; i<len; i++){
- var v = array[i];
- array[i] = v.substr(0,1).toUpperCase() + v.substr(1,v.length);
- name=array.join("");
- }
- }
- console.log("_format() new name=>",name);
- return name;
- }
- };
- };
- }(jQuery, window));
HTML5 data-* 自定义属性操作及其注意点的更多相关文章
- HTML5中自定义属性(data-*)
在HTML元素上直接添加以‘data-’开头的属性,例如 <div data-mydata='this is my data'></div> 操作它的方式有classList ...
- HTML5 本地文件操作之FileSystemAPI整理(一)
一.请求配额 DeprecatedStorageInfo对象 window.webkitStorageInfo:当使用持久存储模式时需要用到该对象的接口 方法: 1.requestQuota(type ...
- HTML5——Data Url生成
HTML5——Data Url生成 <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...
- HTML5 本地文件操作之FileSystemAPI实例(四)
目录操作Demo二 1.删除目录 window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSyst ...
- HTML5 本地文件操作之FileSystemAPI实例(三)
文件夹操作demo 1.读取根目录文件夹内容 window.requestFileSystem = window.requestFileSystem || window.webkitRequestFi ...
- HTML5 本地文件操作之FileSystemAPI实例(二)
文件操作实例整理二 1.删除文件.复制文件.移动文件 //获取请求权限 window.requestFileSystem = window.requestFileSystem || window.we ...
- HTML5 本地文件操作之FileSystemAPI实例(一)
文件操作实例整理一 1.请求系统配额类型 console.info(window.TEMPORARY); //0 临时 console.info(window.PERSISTENT); //1 持久 ...
- HTML5 本地文件操作之FileSystemAPI整理(二)
一.文件目录操作 1.DirectoryEntry对象 属性: 1.isFile: 操作对象的是否为文件,DirectoryEntry对象固定其值为false 2.isDirectory: 操作对象是 ...
- HTML5 本地文件操作之FileSystemAPI简介
一.FileSystemAPI简介 HTML5的文件操作Api中 1.FileAPI,用于基础的客户端本地文件读取,目前大多数接口已经被主流浏览器支持,点击查看更多参考 2.FileSystemAPI ...
- html5 data属性的使用
html5 data属性定义和用法 <ul> <li data-animal-type="bird">Owl</li> <li data- ...
随机推荐
- [Shell]Shell学习笔记之for
关于shell中的for循环用法很多,一直想总结一下,今天网上看到上一篇关于for循环用法的总结,感觉很全面,所以就转过来研究研究,嘿嘿…1. for((i=1;i<=10;i++));do e ...
- windows_study_2
描述:如何确定像%ProgramFiles%这样格式的目录的具体位置? 解决:运行——cmd——echo %ProgramFiles%——回车——界面就显示出目录位置了.
- Educational Codeforces Round 3 C
C. Load Balancing time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- http文件上传/下载
package unit; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputSt ...
- 3.centos7 常用防火墙命令(转)
1.firewalld的基本使用 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status f ...
- Modbus协议学习笔记
之前也有写过基于 Modbus 通讯协议的控制远程监控程序,但是由于当时时间赶.人手少(软硬件前后台都是在下一人
- mapreduce统计总数
现有某电商网站用户对商品的收藏数据,记录了用户收藏的商品id以及收藏日期,名为buyer_favorite1. buyer_favorite1包含:买家id,商品id,收藏日期这三个字段,数据以“\t ...
- Error in event handler for "el.form.change": "TypeError: value.getTime is not a function"
首先说一下我使用的实际场景 html代码: js代码: 首先说明出现原因,elementUI的日期选择器[el-date-picker]在加上格式 value-format="yyyy-MM ...
- epoll 中ET与LT 关于读取处理 复习
https://zhuanlan.zhihu.com/p/21374980 =============================================== https://zhuanl ...
- eclipse decompiler
# eclipse -> help -> eclipse marketplace # decompiler