jQuery 中 data 方法的实现原理

前言:jQuery 作为前端使用最多最广泛的 JS 库,其源码每个 JSer 都应该研究一下。早就打算看却一直被各种事拖着,上次某公司面试时被问到 jQuery 中 data 方法是如何实现的,结果答不上来懊悔不已。现在终于下决心开始看 jQuery 的源码,就从 data 方法开始。本人也是前端新手,如果文章中有理解不当或者错误之处,欢迎留言指出,3Q~ jQuery 版本为 1.8.2

data() 的使用方法

//向一个 dom 元素绑定数据
$("#header").data("aaa", 123); //给 header 绑定了一个数据其key为"aaa",value为123
$("#header").data({"name": "xiaoming", "age": 20}); //也可以将所有数据作为一个对象直接整体绑定在元素上//获取绑定的数据
$("#header").data("aaa"); //获取 header 上绑定的 key 为"aaa"的值,如果没有在 cache 对象(下面分析源码时会讲到)中找到,会解析元素的 html 5 标签 data-*,并将值存入 cache 对象
$("#header").data(); //获取 header 上绑定的所有数据//移除绑定的数据
$("#header").removeData("name"); //移除 header 上绑定的 key 为 name 的数据
$("#header").removeData(); //移除 header 上绑定的所有数据

源码中 data() 方法相关的代码

jQuery.extend({//全局变量,负责保存给每个 dom 元素绑定的数据
cache: {},//全局变量,当已经绑定的数据被 cleanData 方法清除以后,回收的 id保存在改变量中
deletedIds: [],//当前版本没有用到 在(1.9/2.0)版本中将移除uuid: 0,//为 jQuery实例 添加一个唯一标示,区别不同的 jQuery 实例(比如同一工程内不同版本的 jQuery)绑定的数据,比如:  jQuery164018232414545491338,前缀+版本号+随机数expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, ""),//下面几类元素是不给绑定数据的,如果绑定会报错
noData: {"embed": true,//除了 flash 之外的 object 对象"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000","applet": true},//判断一个元素是否已经绑定有数据hasData: function( elem ) {   },//绑定数据 ( pvt 为 false 时,数据会添加到 cache 中元素对应 id 下的data 属性中,pvt 为 true 则把绑定的数据直接添加到 cache 中元素对应的id 下,与 data 属性并列。jQuery 绑定内部数据 events、handle 等都是通过 _data 方法将 pvt 设置为 true )data: function( elem, name, data, pvt /*该参数内部使用*/) {   },//移除数据removeData: function( elem, name, pvt /*该参数内部使用*/) {   },//仅限内部调用,添加内部数据_data: function( elem, name, data ) {   },//判断一个 dom 节点是否可以绑定数据acceptData: function( elem ) {    },//清除节点上绑定的事件和节点的 jQuery 实例标识属性cleanData: function( elems, /*internal*/acceptData ) {    }
});jQuery.fn.extend({//提供给开发者调用的绑定数据方法data: function( key, value ) {    },//提供给开发者调用的移除数据方法removeData: function( key ) {    }
});//解析元素中 html5 标签 data-* 的值。如果在 cache 对象当中已经获取到对应值则直接返回不解析 data-* 属性,否则解析 data-* 属性并且将数据添加至 cache 对象中存储。
functiondataAttr( elem, key, data ) {    }//判断cache 下保存的数据对象是否为空,当且仅当数据对象只有一个 data 属性,且值为空时才为空
function isEmptyDataObject( obj ) {    }

jQuery.extend 与 jQuery.fn.extend 的区别在于:

jQuery.extend 是在 jQuery 这个构造函数上扩展的方法,调用的时候写成 $.xxx 或者 jQuery.xxx

jQuery.fn.extend 是在 jQuery 原型上扩展的方法,原型上的方法被所有 jQuery 对象共享,调用的时候为 $().xxx

给元素绑定的数据的保存格式

$("#header").data("title", "hello world");//执行后打印 $.cache 结果为
{1: {data: {title :"hello world"}}
}//并且查看 header 元素,发现属性中多了一行 "jQuery18102873769768048078: 1" 其中 key 值那一长串为 jQuery 实例唯一标识,1 是 header 元素绑定的数据在 cache 对象中对应的属性名,该值每次增加 1,
$("#footer").data("foot", "goodbye");//执行后打印 $.cache 结果为
{1: {data: {title :"hello world"}},2: {data: {foot :"goodbye"}}
}//同样 footer 元素的属性中多了一行 "jQuery18102873769768048078: 2"

给元素绑定的事件处理程序也会保存在 cache 对象中

$("#header").click(function(){});//绑定点击事件后,$.cache 的内容为
{1: {data : {title :"hello world"},events : {click : []//click 对应的数组内容省略
},handle :function(){ }  //function 的内容及属性省略
}2: {data : {foot :"goodbye"}}
}//可见给 dom 元素绑定事件处理程序后,多了 events 和 handle 两个属性,jQuery 自动将这些数据绑定到 cache 对象中元素对应的数据对象中

通过全局对象 cache 来保存 dom 元素上绑定的数据,可以避免 dom 对象和 js 对象之间互相引用导致的循环引用问题。

data() 方法相关事件

与 data() 方法相关的事件有 getData、setData、changeData,使用方法见代码

$("#header").bind("getData" ,function(){console.log("getData");}).bind("setData" , function(){console.log("setData");}).bind("changeData" , function(){console.log("changeData");});
$("#header").data("name" , "Austin"); //打印  "setData" "changeData"
$("#header").data("name");            //打印"getData"

posted on 2014-05-29 16:35 AiQFeng 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/AustinAn/p/3759456.html

jQuery 中 data 方法的实现原理相关推荐

  1. matlab中二维插值中cubic方法的实现原理(个人见解)

    通过查找matlab的帮助程序,对离散数据格网化采用的方法有如下5种: griddata(..., METHOD) where METHOD is one of         'nearest'   ...

  2. matlab中内插cubic,matlab中二维插值中cubic方法的实现原理(个人见解)

    通过查找matlab的帮助程序,对离散数据格网化采用的方法有如下5种: griddata(..., METHOD) where METHOD is one of 'nearest'   - Neare ...

  3. js中flat方法的实现原理

    Array.prototype.flat(),将多维数组降维 let arr = [1, [2, 3, [4, 5, [12, 3, "zs"], 7, [8, 9, [10, 1 ...

  4. python运行mcmc为何老出错_python中mcmc方法的实现

    MCMC方法在贝叶斯统计中运用很多,MIT发布的EMCEE是实现的比较好的.介绍页面在下面.源代码中examples里的代码可以帮助理解各种功能,特别是line.py 列出了最小二乘法,最大似然法和M ...

  5. jQuery中getJSON跨域原理详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp28 jQuery中getJSON跨域原理详解 前几天我再开发一个叫 河蟹工 ...

  6. scala 函数方法、函数方法的实现原理

    文章目录 1. 函数&方法 2. 函数&方法的实现原理 1. 函数&方法   scala中方法是类的一部分,而函数是一个对象,可以赋值给一个变量.scala 中的方法跟 Jav ...

  7. sort排序方法的实现原理

    sort 排序方法的实现原理   我们比较常用的是直接调用 JS的 sort方法,围绕原生 JS方法,并结合 V8排序的代码一起来分析,以便碰到类似的 JS排序问题时能够轻松应对.   在开始前请思考 ...

  8. jquery中prop()方法和attr()方法

    接着上一篇笔记的疑惑,找了下prop()方法和attr()方法的区别.原来query1.6中新加了一个方法prop(),一直没用过它,官方解释只有一句话:获取在匹配的元素集中的第一个元素的属性值. 大 ...

  9. 链式调用方法的实现原理和方法

    1.什么是链式调用? Person person = new Person().setName(fog).setAge(18).setSex(man).setJob(software engineer ...

最新文章

  1. 数据库性能分析及调整一例
  2. sealed、new、virtual、abstract与override 趣解
  3. mysql中字符串拼接函数_MySQL字符串连接函数
  4. 计算机视觉中的牛人贡献及其主页
  5. GIS之旅——大学本科总结
  6. Mac基础操作:如何用启动台来查看和打开App
  7. 网络异步编程(C#)团购课
  8. Ubuntu系统的下载与安装(超详细)
  9. Ubuntu下好用的文档比较工具Meld,代替Notepad++的文档对比功能?
  10. 第六届北大CIO班结业暨SOA与BPM论坛成功举办
  11. 《雍正皇帝·九王夺嫡》物质文化专有词泰译研究(二)
  12. 如何分析和判断中国经济大势
  13. c语言延时0.5s程序,C语言延时程序(ms,us)
  14. Jetpack Compose - Switch
  15. 苹果电脑计算机无法启动,MacBook Pro 按开机按钮没反应无法开机
  16. 痴呆患者血脑屏障(Blood-Brain Barrier, BBB)功能测量
  17. NTC热敏电阻设计高精度温度计的方案1
  18. P1258 小车问题(二分法)
  19. 脚本木马的制作与原理
  20. 夜游经济文化旅游如何打造城市IP

热门文章

  1. jmeter 控制偏离_Jmeter(二十) - 从入门到精通 - JMeter监听器 -下篇(详解教程)
  2. Web前端新手必看的7种技术,从菜鸟到高级开发的蜕变!
  3. 关于JavaScript系列的自学,该怎么学比较好?
  4. docker运行yyets_使用Docker镜像
  5. 火绒规则 禁止所有软件的安装_十大机械设计软件对比,附所有软件安装资料...
  6. c++删除文件delete_开启phpstudy中apache的put和delete请求方法并进行测试
  7. 下列哪个适合做链栈_外贸企业如何做Google推广?自然排名和付费广告哪个更适合你?...
  8. string能存多大数据_信息技术助力精准教学:大数据到底有多好用?
  9. mongodb连接池 php,node.js,mongodb_nodejs使用mongodb连接池,node.js,mongodb - phpStudy
  10. 【博客大赛】100行js代码实现网站在线用户数量统计 nodejs + socket.io方案