jQuery $.data()方法使用注意细节


Posted in Javascript onDecember 31, 2012

前段时间同事在群里对jQuery里的.data()方法大发牢骚:
XXX(NNNNNNN) 15:11:34
<a id="a" data-xxx="00123" />
alert($('#a').data('xxx'));//123
data方法不靠谱
XXX(NNNNNNN) 15:13:17
老老实实用attr('data-xxx')吧细研究了下jQuery文档对.data()方法的描述:

As of jQuery 1.4.3 HTML 5 data- attributes will be automatically pulled in to jQuery's data object. 
The treatment of attributes with embedded dashes was changed in jQuery 1.6 to conform to the W3C HTML5 
specification.

针对如下示便
<div data-role="page" data-last-value="43" data-hidden="true" data-options='{"name":"John"}'></div> 
$("div").data("role") === "page"; 
$("div").data("lastValue") === 43; 
$("div").data("hidden") === true; 
$("div").data("options").name === "John";

即当使用.data()获取值时,jQuery会首先尝试将获取的字符串值转化成JS类型,包括布尔值,null,数字,对象,数组:
若值是”true|false”,则返回相应的布尔值;
若值是”null”,则返回null;
若值是纯数字构成的字符串(+data + ”” === data),则返回相应的数字(+data);
若值是由(?:\{[\s\S]*\}|\[[\s\S]*\])$,比如”{key:value}“或[1,2,3],则尝试使用jQuery.parseJSON解析之;
否则返回字符串值
当然文档里也特意说明了——如果就是想获取字符串值而不想获得自动转换的值,可以使用.attr(“data-”+key)来获取相应的值:
To retrieve the value's attribute as a string without any attempt to convert it, use the attr() method.

如下为jQuery源码
function dataAttr( elem, key, data ) { 
// If nothing was found internally, try to fetch any 
// data from the HTML5 data-* attribute 
if ( data === undefined && elem.nodeType === 1 ) { 
// rmultiDash = /([A-Z])/g 
var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); 
data = elem.getAttribute( name ); 
if ( typeof data === "string" ) { 
try { 
/*.data(key)方法尝试将获取的值转化成JS类型,包括布尔值,null,数字,对象,数组*/ 
data = data === "true" ? true : 
data === "false" ? false : 
data === "null" ? null : 
// Only convert to a number if it doesn't change the string 
+data + "" === data ? +data : 
/*rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,*/ 
rbrace.test( data ) ? jQuery.parseJSON( data ) : 
data; 
} catch( e ) {} 
// Make sure we set the data so it isn't changed later 
jQuery.data( elem, key, data ); 
} else { 
data = undefined; 
} 
} 
return data; 
}
Javascript 相关文章推荐
javascript下给元素添加事件的方法与代码
Aug 13 Javascript
jQuery拖动图片删除示例
May 10 Javascript
Javascript判断文件是否存在(客户端/服务器端)
Sep 16 Javascript
$(&quot;&quot;).click与onclick的区别示例介绍
Sep 25 Javascript
零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门
Dec 20 Javascript
JavaScript字符串删除重复字符的方法
Dec 25 Javascript
js控制文本框禁止输入特殊字符详解
Apr 07 Javascript
使用 Javascript 实现浏览器推送提醒功能的示例
Nov 03 Javascript
Vue源码分析之Vue实例初始化详解
Aug 25 Javascript
js实现一款简单踩白块小游戏(曾经很火)
Dec 02 Javascript
JS数组的常用方法整理
Mar 31 Javascript
react中props 的使用及进行限制的方法
Apr 28 Javascript
JavaScript 盒模型 尺寸深入理解
Dec 31 #Javascript
如何制作浮动广告 JavaScript制作浮动广告代码
Dec 30 #Javascript
JavaScript 在网页上单击鼠标的地方显示层及关闭层
Dec 30 #Javascript
javascript中的缓动效果实现程序
Dec 29 #Javascript
通过正则格式化url查询字符串实现代码
Dec 28 #Javascript
Js数组的操作push,pop,shift,unshift等方法详细介绍
Dec 28 #Javascript
载入jQuery库的最佳方法详细说明及实现代码
Dec 28 #Javascript
You might like
关于拼配咖啡,你要知道
2021/03/03 咖啡文化
PHP 和 XML: 使用expat函数(二)
2006/10/09 PHP
php正则过滤html标签、空格、换行符的代码(附说明)
2010/10/25 PHP
Linux下PHP安装mcrypt扩展模块笔记
2014/09/10 PHP
解密效果
2006/06/23 Javascript
JQuery Tips(3) 关于$()包装集内元素的改变
2009/12/14 Javascript
Extjs中DisplayField的日期或者数字格式化扩展
2010/09/03 Javascript
基于Jquery的淡入淡出的特效基础练习
2010/12/13 Javascript
JS模板实现方法
2013/04/03 Javascript
javascript中加号(+)操作符的一些神奇作用
2014/06/06 Javascript
javascript制作坦克大战全纪录(2)
2014/11/27 Javascript
使用原生的javascript来实现轮播图
2017/02/24 Javascript
Angular2安装angular-cli
2017/05/21 Javascript
JS库之Highlight.js的用法详解
2017/09/13 Javascript
JS中双击和单击事件冲突的解决方法
2018/04/09 Javascript
父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法
2018/04/25 Javascript
使用 Angular RouteReuseStrategy 缓存(路由)组件的实例代码
2019/11/01 Javascript
解决vue+router路由跳转不起作用的一项原因
2020/07/19 Javascript
使用vue实现通过变量动态拼接url
2020/07/22 Javascript
js+html+css实现手动轮播和自动轮播
2020/12/30 Javascript
[02:43]DOTA2亚洲邀请赛场馆攻略——带你走进东方体育中心
2018/03/19 DOTA
python命令行参数sys.argv使用示例
2014/01/28 Python
Python中的包和模块实例
2014/11/22 Python
python实现支持目录FTP上传下载文件的方法
2015/06/03 Python
python中的break、continue、exit()、pass全面解析
2017/08/05 Python
python使用webdriver爬取微信公众号
2018/08/31 Python
python3中使用__slots__限定实例属性操作分析
2020/02/14 Python
python中pdb模块实例用法
2021/01/15 Python
python绘图模块之利用turtle画图
2021/02/12 Python
CSS3制作苹果风格键盘特效
2015/02/26 HTML / CSS
内勤主管岗位职责
2014/04/03 职场文书
2014年村委会工作总结
2014/11/24 职场文书
2015年办公室工作总结范文
2015/03/31 职场文书
投资公司董事长岗位职责
2015/04/16 职场文书
大学毕业论文致谢词
2015/05/14 职场文书
vmware虚拟机打不开vmx文件怎么办 ?vmware虚拟机vmx文件打开方法
2022/04/08 数码科技