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 相关文章推荐
My Desktop :) 桌面式代码
Dec 29 Javascript
JavaScript 常用函数
Dec 30 Javascript
JS 非图片动态loading效果实现代码
Apr 09 Javascript
javascript时间自动刷新实现原理与步骤
Jan 06 Javascript
js限制文本框只能输入数字方法小结
Jun 16 Javascript
JavaScript实现列表分页功能特效
May 15 Javascript
原生JS京东轮播图代码
Mar 22 Javascript
使用jQuery卸载全部事件的思路详解
Apr 03 jQuery
angular的输入和输出的使用方法
Sep 22 Javascript
使vue实现jQuery调用的两种方法
May 12 jQuery
微信小程序数据统计和错误统计的实现方法
Jun 26 Javascript
vue-cil之axios的二次封装与proxy反向代理使用说明
Apr 07 Vue.js
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
一个显示某段时间内每个月的方法 返回由这些月份组成的数组
2012/05/16 PHP
PHP CodeBase:将时间显示为&quot;刚刚&quot;&quot;n分钟/小时前&quot;的方法详解
2013/06/06 PHP
解析在PHP中使用全局变量的几种方法
2013/06/24 PHP
JavaScript实现禁止后退的方法
2006/12/27 Javascript
JS trim去空格的最佳实践
2011/10/30 Javascript
如何阻止复制剪切和粘贴事件为了表单内容的安全
2013/05/23 Javascript
JavaScript事件委托的技术原理探讨示例
2014/04/17 Javascript
js用typeof方法判断undefined类型
2014/07/15 Javascript
node.js开机自启动脚本文件
2014/12/24 Javascript
jquery动态添加删除(tr/td)
2015/02/09 Javascript
JS加载器如何动态加载外部js文件
2016/05/26 Javascript
BootStrap Table前台和后台分页对JSON格式的要求
2017/06/28 Javascript
解决canvas画布使用fillRect()时高度出现双倍效果的问题
2017/08/03 Javascript
解决Angularjs异步操作后台请求用$q.all排列先后顺序问题
2019/11/29 Javascript
在vue中封装的弹窗组件使用队列模式实现方法
2020/07/23 Javascript
原生js实现下拉框选择组件
2021/01/20 Javascript
python登录并爬取淘宝信息代码示例
2017/12/09 Python
python多进程实现文件下载传输功能
2018/07/28 Python
python requests指定出口ip的例子
2019/07/25 Python
wxPython色环电阻计算器
2019/11/18 Python
selenium中get_cookies()和add_cookie()的用法详解
2020/01/06 Python
通过python实现windows桌面截图代码实例
2020/01/17 Python
在Anaconda3下使用清华镜像源安装TensorFlow(CPU版)
2020/04/19 Python
PyCharm最新激活码(2020/10/27全网最新)
2020/10/27 Python
用HTML5 Canvas API中的clearRect()方法实现橡皮擦功能
2016/03/15 HTML / CSS
阿联酋航空官方网站:Emirates
2017/10/17 全球购物
英国最大的户外商店:Go Outdoors
2019/04/17 全球购物
质检的岗位职责
2013/11/17 职场文书
策划总监岗位职责
2014/02/16 职场文书
打架检讨书2000字
2014/02/22 职场文书
学习作风建设心得体会
2014/10/22 职场文书
2015年事业单位工作总结
2015/04/27 职场文书
护士医德医风心得体会
2016/01/25 职场文书
导游词之镜泊湖
2019/12/09 职场文书
Java SSM配置文件案例详解
2021/08/30 Java/Android
代码复现python目标检测yolo3详解预测
2022/05/06 Python