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 textarea的长度进行验证
May 06 Javascript
JS 中document.URL 和 windows.location.href 的区别
Nov 11 Javascript
GWT中复制到剪贴板 js+flash实现复制 兼容性比较好
Mar 07 Javascript
Jquery选择子控件&quot;大于号&quot;和&quot; &quot;区别介绍及使用示例
Jun 25 Javascript
通过AJAX的JS、JQuery两种方式解析XML示例介绍
Sep 23 Javascript
Javascript中字符串replace方法的第二个参数探究
Dec 05 Javascript
angular实现表单验证及提交功能
Feb 01 Javascript
Iscrool下拉刷新功能实现方法(推荐)
Jun 26 Javascript
关于HTML5的data-*自定义属性的总结
May 05 Javascript
JS实现把一个页面层数据传递到另一个页面的两种方式
Aug 13 Javascript
vue实现倒计时获取验证码效果
Apr 17 Javascript
vue如何使用外部特殊字体的操作
Jul 30 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里面的抽象类
2010/01/28 PHP
PHP句法规则详解 入门学习
2011/11/09 PHP
解析关于wamp启动是80端口被占用的问题
2013/06/21 PHP
实例讲解如何在PHP的Yii框架中进行错误和异常处理
2016/03/17 PHP
PHP 实现缩略图
2021/03/09 PHP
在模板页面的js使用办法
2010/04/01 Javascript
js的写法基础分析
2011/01/17 Javascript
从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件
2011/02/23 Javascript
利用javascript实现禁用网页上所有文本框,下拉菜单,多行文本域
2013/12/14 Javascript
Yarn的安装与使用详细介绍
2016/10/25 Javascript
EasyUI修改DateBox和DateTimeBox的默认日期格式示例
2017/01/18 Javascript
springMVC + easyui + $.ajaxFileUpload实现文件上传注意事项
2017/04/23 Javascript
React Native使用Modal自定义分享界面的示例代码
2017/10/31 Javascript
TypeScript基础入门教程之三重斜线指令详解
2018/10/22 Javascript
解决vue单页面应用中动态修改title问题
2019/06/09 Javascript
vue中的过滤器及其时间格式化问题
2020/04/09 Javascript
浅析python中SQLAlchemy排序的一个坑
2017/02/24 Python
django请求返回不同的类型图片json,xml,html的实例
2018/05/22 Python
python使用Plotly绘图工具绘制水平条形图
2020/03/25 Python
鼠标滚轮事件和Mac触控板双指事件
2019/12/23 HTML / CSS
DAWGS鞋官方网站:鞋,凉鞋,靴子
2016/10/04 全球购物
阿联酋手表和配饰购物网站:Rivolishop
2019/11/25 全球购物
开放系统互连参考模型
2016/06/29 面试题
迟到检讨书5000字
2014/01/31 职场文书
《蒲公英》教学反思
2014/02/28 职场文书
《陈毅探母》教学反思
2014/05/01 职场文书
音乐节策划方案
2014/06/09 职场文书
2014年党课学习心得体会
2014/07/08 职场文书
防灾减灾标语
2014/10/07 职场文书
四风专项整治工作情况汇报
2014/10/28 职场文书
财务整改报告范文
2014/11/05 职场文书
房产分割协议书范文
2014/11/21 职场文书
六一晚会主持词开场白
2015/05/28 职场文书
2016年小学圣诞节活动总结
2016/03/31 职场文书
html5中sharedWorker实现多页面通信的示例代码
2021/05/07 Javascript
「偶像大师 MILLION LIVE!」七尾百合子手办开订
2022/03/21 日漫