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 OOP面向对象介绍
Dec 02 Javascript
不要使用jQuery触发原生事件的方法
Mar 03 Javascript
jQuery实现伪分页的方法分享
Feb 17 Javascript
纯JS前端实现分页代码
Jun 21 Javascript
javascript和jQuery实现网页实时聊天的ajax长轮询
Jul 20 Javascript
jQuery Raty 一款不错的星级评分插件
Aug 24 Javascript
JavaScript高仿支付宝倒计时页面及代码实现
Oct 21 Javascript
Jquery 整理元素选取、常用方法一览表
Nov 26 Javascript
IE8中jQuery.load()加载页面不显示的原因
Nov 15 jQuery
Bootstrap 实现表格样式、表单布局的实例代码
Dec 09 Javascript
微信小程序 行的删除和增加操作实现详解
Sep 29 Javascript
vue+elementUI组件table实现前端分页功能
Nov 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原创论坛
2006/10/09 PHP
php 设计模式之 工厂模式
2008/12/19 PHP
php 伪静态之IIS篇
2014/06/02 PHP
PHP新特性之字节码缓存和内置服务器
2017/08/11 PHP
如何让PHP编码更加好看利于阅读
2019/05/12 PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
2020/01/23 PHP
JavaScript中常见陷阱小结
2010/04/27 Javascript
jQuery中绑定事件的命名空间详解
2011/04/05 Javascript
深入理解JavaScript编程中的同步与异步机制
2015/06/24 Javascript
基于JavaScript实现带缩略图的轮播效果
2017/01/12 Javascript
jQuery获取Table某列的值(推荐)
2017/03/03 Javascript
vue自定义指令directive实例详解
2018/01/17 Javascript
nodejs 日志模块winston的使用方法
2018/05/02 NodeJs
JavaScript DOM元素常见操作详解【添加、删除、修改等】
2018/05/09 Javascript
vue使用jsonp抓取qq音乐数据的方法
2018/06/21 Javascript
JavaScript函数节流和函数去抖知识点学习
2018/07/31 Javascript
JS XMLHttpRequest原理与使用方法深入详解
2020/04/30 Javascript
Python中常见的数据类型小结
2015/08/29 Python
Python实现基本数据结构中队列的操作方法示例
2017/12/04 Python
解决python3 安装不了PIL的问题
2019/08/16 Python
Python3标准库之functools管理函数的工具详解
2020/02/27 Python
Anconda环境下Vscode安装Python的方法详解
2020/03/29 Python
Python使用monkey.patch_all()解决协程阻塞问题
2020/04/15 Python
使用tensorflow进行音乐类型的分类
2020/08/14 Python
Django中和时区相关的安全问题详解
2020/10/12 Python
CSS3实现缺角矩形,折角矩形以及缺角边框
2019/12/20 HTML / CSS
HTML5 3D衣服摇摆动画特效
2016/03/17 HTML / CSS
Tarte Cosmetics官网:美国最受欢迎的化妆品公司之一
2017/08/24 全球购物
屈臣氏乌克兰:Watsons UA
2019/10/29 全球购物
extern在函数声明中是什么意思
2014/01/19 面试题
一道SQL面试题
2012/12/31 面试题
服装销售人员求职自我评价
2013/09/26 职场文书
视光学专业毕业生推荐信
2013/10/28 职场文书
中考百日冲刺决心书
2015/09/22 职场文书
2019毕业论文致谢词
2019/06/24 职场文书
pandas DataFrame.shift()函数的具体使用
2021/05/24 Python