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的AJAX实现文件下载的小例子
May 15 Javascript
JSF中confirm弹出框的用法示例介绍
Jan 07 Javascript
javascript结合Canvas 实现简易的圆形时钟
Mar 11 Javascript
分享9个最好用的JavaScript开发工具和代码编辑器
Mar 24 Javascript
使用JavaScript脚本无法直接改变Asp.net中Checkbox控件的Enable属性的解决方法
Sep 16 Javascript
JS中Json数据的处理和解析JSON数据的方法详解
Jun 29 Javascript
Backbone中View之间传值的学习心得
Aug 09 Javascript
浅谈jQuery中Ajax事件beforesend及各参数含义
Dec 03 Javascript
详解angular2采用自定义指令(Directive)方式加载jquery插件
Feb 09 Javascript
JavaScript使用readAsDataUrl方法预览图片
May 10 Javascript
JavaScript获取用户所在城市及地理位置
Apr 21 Javascript
Node.js 实现远程桌面监控的方法步骤
Jul 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中操作MySQL数据库的一些要注意的问题
2006/10/09 PHP
php下MYSQL limit的优化
2008/01/10 PHP
PHP下获取上个月、下个月、本月的日期(strtotime,date)
2014/02/02 PHP
php中的路径问题与set_include_path使用介绍
2014/02/11 PHP
php使用cookie保存用户登录的用户名实例
2015/01/26 PHP
在laravel中实现将查询的对象转换为多维数组的函数
2019/10/21 PHP
js innerHTML 的一些问题的解决方法
2008/06/22 Javascript
js replace替换所有匹配的字符串
2014/02/13 Javascript
JS实现固定在右下角可展开收缩DIV层的方法
2015/02/13 Javascript
ECMAScript6中Set/WeakSet详解
2015/06/12 Javascript
Webpack+Vue如何导入Jquery和Jquery的第三方插件
2017/02/20 Javascript
node中Express 动态设置端口的方法
2017/08/04 Javascript
微信小程序将字符串生成二维码图片的操作方法
2018/07/17 Javascript
Python打印scrapy蜘蛛抓取树结构的方法
2015/04/08 Python
浅谈Python中列表生成式和生成器的区别
2015/08/03 Python
Python操作word常见方法示例【win32com与docx模块】
2018/07/17 Python
Python爬虫的两套解析方法和四种爬虫实现过程
2018/07/20 Python
python matplotlib实现双Y轴的实例
2019/02/12 Python
Django 导出项目依赖库到 requirements.txt过程解析
2019/08/23 Python
python isinstance函数用法详解
2020/02/13 Python
Python求两个字符串最长公共子序列代码实例
2020/03/05 Python
Python通过文本和图片生成词云图
2020/05/21 Python
深入了解NumPy 高级索引
2020/07/24 Python
python获取linux系统信息的三种方法
2020/10/14 Python
HTML5 语音搜索只需一句代码
2013/01/03 HTML / CSS
西班牙土拨鼠床垫公司,感觉在云端:Marmota
2019/03/18 全球购物
如何利用cmp命令比较文件
2013/09/23 面试题
应届生新闻编辑求职信
2013/11/19 职场文书
小溪流的歌教学反思
2014/02/13 职场文书
2014信息公开实施方案
2014/02/22 职场文书
教师师德师风自我剖析材料
2014/09/29 职场文书
考试作弊检讨书范文
2015/01/27 职场文书
如何写好竞聘报告
2019/04/03 职场文书
SpringBoot实现异步事件驱动的方法
2021/06/28 Java/Android
SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 WIN-8IVSNAQS8T7\Administrator 的信息
2021/06/30 SQL Server
mysql insert 存在即不插入语法说明
2022/03/25 MySQL