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 demo 基本技巧
Dec 18 Javascript
在JavaScript中判断整型的N种方法示例介绍
Jun 18 Javascript
node.js+Ajax实现获取HTTP服务器返回数据
Nov 26 Javascript
理解JavaScript事件对象
Jan 25 Javascript
JS实现购物车特效
Feb 02 Javascript
简单实现bootstrap导航效果
Feb 07 Javascript
如何用js判断dom是否有存在某class的值
Feb 13 Javascript
vue-cli脚手架-bulid下的配置文件
Mar 27 Javascript
jQuery实现基本淡入淡出效果的方法详解
Sep 05 jQuery
javascript中函数的写法实例代码详解
Oct 28 Javascript
javascript面向对象三大特征之封装实例详解
Jul 24 Javascript
Vue数据双向绑定原理实例解析
May 15 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/28 PHP
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
2012/04/09 PHP
php curl获取网页内容(IPV6下超时)的解决办法
2013/07/16 PHP
关于URL最大长度限制的相关资料查证
2014/12/23 PHP
php将图片文件转换成二进制输出的方法
2015/06/10 PHP
ubuntu下配置nginx+php+mysql详解
2015/09/10 PHP
[原创]php token使用与验证示例【测试可用】
2017/08/30 PHP
PHP filesize函数用法浅析
2019/02/15 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
2019/11/19 PHP
Javascript的getYear、getFullYear、getUTCFullYear异同分享
2011/11/30 Javascript
关于innerHTML后丢失动态绑定的EVENT问题解决方法
2013/05/19 Javascript
IE8中动态创建script标签onload无效的解决方法
2014/12/22 Javascript
JavaScript使用setInterval()函数实现简单轮询操作的方法
2015/02/02 Javascript
Javascript核心读书有感之表达式和运算符
2015/02/11 Javascript
vue3.0 CLI - 2.2 - 组件 home.vue 的初步改造
2018/09/14 Javascript
vue中将html字符串转换成html后遇到的问题小结
2018/12/10 Javascript
Vue 权限控制的两种方法(路由验证)
2019/08/16 Javascript
Vue实现星级评价效果实例详解
2019/12/30 Javascript
js+canvas实现刮刮奖功能
2020/09/13 Javascript
多个Vue项目部署到服务器的步骤记录
2020/10/22 Javascript
vue添加自定义右键菜单的完整实例
2020/12/08 Vue.js
[02:49]2014DOTA2电竞也是体育项目! 势要把荣誉带回中国!
2014/07/20 DOTA
python八大排序算法速度实例对比
2017/12/06 Python
pycharm在调试python时执行其他语句的方法
2018/11/29 Python
Python代码实现删除一个list里面重复元素的方法
2019/04/02 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
2019/11/08 Python
python利用tkinter实现图片格式转换的示例
2020/09/28 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
2020/10/15 Python
HTML5中使用json对象的实例代码
2018/09/10 HTML / CSS
amazeui时间组件的实现示例
2020/08/18 HTML / CSS
微软新西兰官方网站:Microsoft New Zealand
2018/08/17 全球购物
美国户外服装和装备购物网站:Outland USA
2020/03/22 全球购物
自学考试自我鉴定范文
2013/09/26 职场文书
2014大学生全国两会学习心得体会
2014/03/13 职场文书
大学自主招生推荐信
2014/05/10 职场文书
html+css实现赛博朋克风格按钮
2021/05/26 HTML / CSS