对 jQuery 中 data 方法的误解分析


Posted in Javascript onJune 18, 2014

今天 谢亮 兄弟和我讨论一个东西的时候,谈到了性能,他用的是 attr 操作自定义属性 data-uid,我说用 data 好,因为是 dataset 实现,然后他去翻了下 jQuery 源码和我说,没有发现这个东西,我就纳闷了。于是我去仔细读了下 data 方法的源码,才发现我一直误会了,再此,向之前问我 data 方法的群友道歉,我 "骗" 了你们,你们来打我吧。

今天我就重新解释下 data 方法,先看下 jQuery 1.11.0 的手册里肿么说的吧,请移步至http://shouce.3water.com/jquery/data.html、
用法这里说的很清楚了,但是内部是怎么实现的呢? 戳我看源码  (看不懂没关系,我会简单分析下他的流程)

其实是这样的,当我们执行例如这样的语句时 $("#id").data("test"); (简化后的过程) 
第一步: jQuery 会获取到 $("#id") 元素,对吧、 
第二步: 执行到 data方法 的时候,他会通过 attributes 取我们要的对应值。 
第三步: 返回结果给我们,然后 jQuery 把值缓存到内部对象里 
第一次取的时候,我们可以得到的 undefined,字符串,数字或者解析后的json。 
 
那有人会说这个和 attr 有什么区别呢? 
当我们第二次执行 $("#id").data("test"); 的时候: 
第一步: jQuery 会获取到 $("#id") 元素,和上面一样。 
第二步: 执行到 data方法 的时候,从 jQuery 的缓存中取值 
第三步: 返回结果给我们 
 
发现第二步不同了,对吧,为什么不是从 attributes 取值,而是从缓存中取呢? 
缓存其实是js的对象,简单说就类似 var cache = {}; jQuery 在第一次取值之后就会保存到这个缓存对象中,这样我们再次操作的时候就非常快了、 
往往性能的损耗都是在 dom 操作上,所以避免重复操作 dom 是非常必要的。 
 
到这,也能看出他和 attr 最大的区别了,比如 <div id="id" data-test="hehe"></div> 
$("#id").data("test", "123"); 执行后依然是 data-test="hehe"
$("#id").attr("data-test", "123"); 执行后会是 data-test="123"
 
那么我们要给一个元素赋值值,或者对象的时候他们有什么区别呢?比如 <div id="id" data-test="hehe"></div> 
$("#id").data("test", {str: "hehe"}); 会把 {str: "hehe"} 赋值给 缓存,元素节点上依然是 data-test="hehe"
$("#id").attr("data-test", {str: "hehe"}); 执行后会是 data-test="[object Object]"
这个应该也有不少人遇到,至少群里有不少人问过这个问题。

其实我之前也没骗你们,自定义属性没必要老是 attr 他,data 是 jQuery 赋予我们的一把瑞士军刀,非常锋利的。

好了,我是懒人,懒的配图,已经写了不少字了,如果有什么说的不对的地方,你们来打我吧

Javascript 相关文章推荐
事件委托与阻止冒泡阻止其父元素事件触发
Sep 02 Javascript
javascript实现超炫的向上滑行菜单实例
Aug 03 Javascript
javascript表单事件处理方法详解
May 15 Javascript
从零学习node.js之文件操作(三)
Feb 21 Javascript
jQuery使用DataTable实现删除数据后重新加载功能
Feb 27 Javascript
Bootstrap Table使用整理(五)之分页组合查询
Jun 09 Javascript
利用Javascript获取选择文本所在的句子详解
Dec 03 Javascript
小程序自定义日历效果
Dec 29 Javascript
layui 富文本编辑器和textarea值的相互传递方法
Sep 18 Javascript
vue2.0+SVG实现音乐播放圆形进度条组件
Sep 21 Javascript
使用vue实现HTML页面生成图片的方法
Mar 12 Javascript
javascript事件循环event loop的简单模型解释与应用分析
Mar 14 Javascript
浅谈 jQuery 事件源码定位问题
Jun 18 #Javascript
js调试系列 源码定位与调试[基础篇]
Jun 18 #Javascript
js调试系列 控制台命令行API使用方法
Jun 18 #Javascript
js调试系列 初识控制台
Jun 18 #Javascript
ext前台接收action传过来的json数据示例
Jun 17 #Javascript
Ext GridPanel加载完数据后进行操作示例代码
Jun 17 #Javascript
ext中store.load跟store.reload的区别示例介绍
Jun 17 #Javascript
You might like
php短域名转换为实际域名函数
2011/01/17 PHP
php中选择什么接口(mysql、mysqli)访问mysql
2013/02/06 PHP
jQuery学习笔记之jQuery的DOM操作
2010/12/22 Javascript
js获取html页面节点方法(递归方式)
2013/12/13 Javascript
js简单实现交换Li的值
2014/05/22 Javascript
跟我学习javascript解决异步编程异常方案
2015/11/23 Javascript
javascript数据结构之二叉搜索树实现方法
2015/11/25 Javascript
javascript获取wx.config内部字段解决微信分享
2016/03/09 Javascript
整理关于Bootstrap排版的慕课笔记
2017/03/29 Javascript
详解webpack 入门总结和实践(按需异步加载,css单独打包,生成多个入口文件)
2017/06/20 Javascript
基于AngularJS的简单使用详解
2017/09/10 Javascript
解决linux下node.js全局模块找不到的问题
2018/05/15 Javascript
VUE 配置vue-devtools调试工具及安装方法
2018/09/30 Javascript
基于nodejs的雪碧图制作工具的示例代码
2018/11/05 NodeJs
利用Python绘制数据的瀑布图的教程
2015/04/07 Python
Python中设置变量访问权限的方法
2015/04/27 Python
python实现逆波兰计算表达式实例详解
2015/05/06 Python
Python本地与全局命名空间用法实例
2015/06/16 Python
在Python中使用正则表达式的方法
2015/08/13 Python
TensorFlow实现AutoEncoder自编码器
2018/03/09 Python
Java与Python两大幸存者谁更胜一筹呢
2018/04/12 Python
pandas 读取各种格式文件的方法
2018/06/22 Python
Python Web框架之Django框架Model基础详解
2019/08/16 Python
python 监测内存和cpu的使用率实例
2019/11/28 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
2020/02/23 Python
Python使用Pygame绘制时钟
2020/11/29 Python
美国领先的汽车轮胎和轮毂供应商:TireBuyer
2016/07/21 全球购物
公司清洁工岗位职责
2013/12/14 职场文书
大班上学期幼儿评语
2014/04/30 职场文书
民主生活会对照检查材料
2014/09/22 职场文书
检查机关党的群众路线个人整改措施
2014/10/04 职场文书
机关职员工作检讨书
2014/10/23 职场文书
出租车拒载检讨书
2015/01/28 职场文书
红色电影观后感
2015/06/18 职场文书
教你用Python matplotlib库制作简单的动画
2021/06/11 Python
搭建Yolov5服务器
2022/04/30 Servers