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 相关文章推荐
jquery下onpropertychange事件的绑定方法
Aug 01 Javascript
JavaScript之appendChild、insertBefore和insertAfter使用说明
Dec 30 Javascript
javascript:void(0)是什么意思示例介绍
Nov 17 Javascript
JS 屏蔽按键效果与改变按键效果的示例代码
Dec 24 Javascript
js时间日期格式化封装函数
Dec 02 Javascript
JavaScript获取两个数组交集的方法
Jun 09 Javascript
js获取当前日期时间及其它日期操作汇总
Mar 08 Javascript
Bootstrap学习系列之使用 Bootstrap Typeahead 组件实现百度下拉效果
Jul 07 Javascript
用director.js实现前端路由使用实例
Jan 27 Javascript
ReactNative踩坑之配置调试端口的解决方法
Jul 28 Javascript
webpack构建react多页面应用详解
Sep 15 Javascript
koa大型web项目中使用路由装饰器的方法示例
Apr 02 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
PHP中的函数嵌套层数限制分析
2011/06/13 PHP
PHP中如何定义和使用常量
2013/02/28 PHP
php更新mysql后获取改变行数的方法
2014/12/25 PHP
使用xampp搭建运行php虚拟主机的详细步骤
2015/10/21 PHP
form自动提交实例讲解
2017/07/10 PHP
php实现数字补零的方法总结
2018/09/12 PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
2019/08/03 PHP
为Yahoo! UI Extensions Grid增加内置的可编辑器
2007/03/10 Javascript
高效的表格行背景隔行变色及选定高亮的JS代码
2010/12/04 Javascript
jquery 简短几句代码实现给元素动态添加及获取提示信息
2011/09/01 Javascript
基于jQuery的模仿新浪微博时间的组件
2011/10/04 Javascript
Tab切换组件(选项卡功能)实例代码
2013/11/21 Javascript
jquerymobile局部渲染的各种刷新方法小结
2014/03/05 Javascript
JS封装的三级联动菜单(使用时只需要一行js代码)
2016/10/24 Javascript
jquery实现百叶窗效果
2017/01/12 Javascript
js实现导航栏中英文切换效果
2017/01/16 Javascript
angular4中引入echarts的方法示例
2019/01/29 Javascript
[02:30]联想杯DOTA2完美世界全国高校联赛—北京站现场
2015/11/16 DOTA
python 文件转成16进制数组的实例
2018/07/09 Python
python多线程下信号处理程序示例
2019/05/31 Python
python高斯分布概率密度函数的使用详解
2019/07/10 Python
python 使用pygame工具包实现贪吃蛇游戏(多彩版)
2019/10/30 Python
Python实现屏幕录制功能的代码
2020/03/02 Python
Python绘制动态水球图过程详解
2020/06/03 Python
Python引入多个模块及包的概念过程解析
2020/09/21 Python
iphoneX 适配客户端H5页面的方法教程
2017/12/08 HTML / CSS
瑞典轮胎在线:Tirendo.se
2018/06/21 全球购物
市场营销专业推荐信
2013/11/03 职场文书
销售经理岗位职责
2014/03/16 职场文书
个人投资计划书
2014/05/01 职场文书
公路绿化方案
2014/05/12 职场文书
2014幼儿园大班工作总结
2014/11/10 职场文书
离婚协议书格式
2014/11/21 职场文书
好好学习保证书
2015/02/26 职场文书
Python insert() / append() 用法 Leetcode实战演示
2021/03/31 Python
帮你提高开发效率的JavaScript20个技巧
2021/06/18 Javascript