对 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 相关文章推荐
IE 缓存策略的BUG的解决方法
Jul 21 Javascript
window.onresize 多次触发的解决方法
Nov 08 Javascript
jquery实现更改表格行顺序示例
Apr 30 Javascript
在JavaScript中判断整型的N种方法示例介绍
Jun 18 Javascript
三分钟带你玩转jQuery.noConflict()
Feb 15 Javascript
快速解决js动态改变dom元素属性后页面及时渲染的问题
Jul 06 Javascript
js如何判断是否在iframe中及防止网页被别站用iframe嵌套
Jan 11 Javascript
javascript+jQuery实现360开机时间显示效果
Nov 03 jQuery
jQuery实现表单动态加减、ajax表单提交功能
Jun 08 jQuery
angular 实现下拉列表组件的示例代码
Mar 09 Javascript
javascript数组元素删除方法delete和splice解析
Dec 09 Javascript
解决antd日期选择组件,添加value就无法点击下一年和下一月问题
Oct 29 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代码优化之成员变量获取速度对比
2014/02/28 PHP
PHP生成(支持多模板)二维码海报代码
2018/04/30 PHP
PHP命名空间namespace及use的简单用法分析
2018/08/03 PHP
Autocomplete Textbox Example javascript实现自动完成成功
2007/08/17 Javascript
Javascript YUI 读码日记之 YAHOO.util.Dom - Part.3
2008/03/22 Javascript
JavaScript可否多线程? 深入理解JavaScript定时机制
2012/05/23 Javascript
jQuery的控件及事件(输入控件及回车事件)使用示例
2013/07/25 Javascript
JS简单计算器实例
2015/01/20 Javascript
JS实现控制表格行内容垂直对齐的方法
2015/03/30 Javascript
jquery实现的Accordion折叠面板效果代码
2015/09/02 Javascript
JS实现的五级联动菜单效果完整实例
2017/02/23 Javascript
Vue.js 2.5新特性介绍(推荐)
2017/10/24 Javascript
webpack vue项目开发环境局域网访问方法
2018/03/20 Javascript
vue实现搜索功能
2019/05/28 Javascript
vue+layui实现select动态加载后台数据的例子
2019/09/20 Javascript
vue实现侧边栏导航效果
2019/10/21 Javascript
JavaScript设计模型Iterator实例解析
2020/01/22 Javascript
基于JavaScript或jQuery实现网站夜间/高亮模式
2020/05/30 jQuery
python统计一个文本中重复行数的方法
2014/11/19 Python
Python使用asyncio包处理并发详解
2017/09/09 Python
Python自定义函数定义,参数,调用代码解析
2017/12/27 Python
使用实现pandas读取csv文件指定的前几行
2018/04/20 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
2018/04/22 Python
python 实现求解字符串集的最长公共前缀方法
2018/07/20 Python
Python基于mysql实现学生管理系统
2019/02/21 Python
Python实现多线程/多进程的TCP服务器
2019/09/03 Python
浅析Django 接收所有文件,前端展示文件(包括视频,文件,图片)ajax请求
2020/03/09 Python
Python‘==‘ 及 ‘is‘相关原理解析
2020/09/05 Python
VSCODE配置Markdown及Markdown基础语法详解
2021/01/19 Python
使用HTML5做的导航条详细步骤
2020/10/19 HTML / CSS
Alba Moda瑞士网上商店:独家意大利时尚女装销售
2016/11/28 全球购物
美国孕妇装品牌:Destination Maternity
2018/02/04 全球购物
Coccinelle官网:意大利的著名皮具品牌
2019/05/15 全球购物
劳动纠纷调解协议书格式
2014/11/30 职场文书
2015年世界无烟日活动方案
2015/05/04 职场文书
Mongo服务重启异常问题的处理方法
2021/07/01 MongoDB