jQuery的实现原理的模拟代码 -2 数据部分


Posted in Javascript onAugust 01, 2010

这个数据当然要通过属性来进行存取,但是,有多个属性怎么办呢?,要定义多个属性吗?,属性的名字叫什么呢?会不会与其他的属性有冲突呢?
在 jQuery 中,针对 DOM 对象扩展的私有数据可以用一个对象来表示,多个数据就使用这个对象的多个属性来表示。为了能够通过 DOM 对象找到这个扩展数据对象,而不会与其他现有的属性冲突,在 jQuery 中通过 expando 这个常量表示扩展对象的属性名,这个 expando 的值是计算出来的。而这个属性的值就是用来找到扩展对象的键值。
例如,我们可以定义 expando 的值为 "jQuery1234" ,那么,我们可以为每个 DOM 对象增加这个名为 "jQuery1234" 的属性,这个属性的值可以是一个键,例如为 1000。
在 jQuery 对象上的 cache 用来保存所有对象扩展的对象,这个对象可以看作一个字典,属性名就是键值,所对应的值就是扩展数据对象。
也就是说,在 jQuery 对象的 cache 上,将会有一个 1000 的成员,这个成员引用的对象就是 1000 号 DOM 对象的私有扩展对象。1000 号成员的私有数据将被存在在这个对象上。
当一个 DOM 对象需要取得扩展数据的时候,首先通过对象的 expando 属性取得一个键值,然后通过这个键值到 jQuery.cache 中取得自己的扩展对象,然后在扩展对象上读写数据。

/// <reference path="jQuery-core.js" /> 
// 常用方法 
function now() { 
return (new Date).getTime(); 
} 
// 扩充数据的属性名,动态生成,避免与已有的属性冲突 
var expando = "jQuery" + now(), uuid = 0, windowData = {}; 
jQuery.cache = {}; 
jQuery.expando = expando; 
// 数据管理,可以针对 DOM 对象保存私有的数据,可以读取保存的数据 
jQuery.fn.data = function (key, value) { 
// 读取 
if (value === undefined) { 
return jQuery.data(this[0], key); 
} 
else { // 设置 
this.each( 
function () { 
jQuery.data(this, key, value); 
} 
); 
} 
} 
// 移除数据,删除保存在对象上的数据 
jQuery.fn.removeData = function (key) { 
return this.each(function () { 
jQuery.removeData(this, key); 
}) 
} // 为元素保存数据 
jQuery.data = function (elem, name, data) { // #1001 
// 取得元素保存数据的键值 
var id = elem[expando], cache = jQuery.cache, thisCache; 
// 没有 id 的情况下,无法取值 
if (!id && typeof name === "string" && data === undefined) { 
return null; 
} 
// Compute a unique ID for the element 
// 为元素计算一个唯一的键值 
if (!id) { 
id = ++uuid; 
} 
// 如果没有保存过 
if (!cache[id]) { 
elem[expando] = id; // 在元素上保存键值 
cache[id] = {}; // 在 cache 上创建一个对象保存元素对应的值 
} 
// 取得此元素的数据对象 
thisCache = cache[id]; 
// Prevent overriding the named cache with undefined values 
// 保存值 
if (data !== undefined) { 
thisCache[name] = data; 
} 
// 返回对应的值 
return typeof name === "string" ? thisCache[name] : thisCache; 
} 
// 删除保存的数据 
jQuery.removeData = function (elem, name) { // #1042 
var id = elem[expando], cache = jQuery.cache, thisCache = cache[id]; 
// If we want to remove a specific section of the element's data 
if (name) { 
if (thisCache) { 
// Remove the section of cache data 
delete thisCache[name]; 
// If we've removed all the data, remove the element's cache 
if (jQuery.isEmptyObject(thisCache)) { 
jQuery.removeData(elem); 
} 
} 
// Otherwise, we want to remove all of the element's data 
} else { 
delete elem[jQuery.expando]; 
// Completely remove the data cache 
delete cache[id]; 
} 
} 
// 检查对象是否是空的 
jQuery.isEmptyObject = function (obj) { 
// 遍历元素的属性,只有要属性就返回假,否则返回真 
for (var name in obj) { 
return false; 
} 
return true; 
} 
// 检查是否是一个函数 
jQuery.isFunction = function (obj) { 
var s = toString.call(obj); 
return toString.call(obj) === "[object Function]"; 
}

下面的脚本可以保存或者读取对象的扩展数据。
// 数据操作 
$("#msg").data("name", "Hello, world."); 
alert($("#msg").data("name")); 
$("#msg").removeData("name"); 
alert($("#msg").data("name"));
Javascript 相关文章推荐
iframe 自适应高度[在IE6 IE7 FF下测试通过]
Apr 13 Javascript
Jquery Ajax学习实例6 向WebService发出请求,返回DataSet(XML) 异步调用
Mar 18 Javascript
初窥JQuery(二) 事件机制(1)
Nov 25 Javascript
iframe窗口高度自适应的实现方法
Jan 08 Javascript
js实现鼠标滑过文字链接色彩变化的效果
May 06 Javascript
JS实现可展开折叠层的鼠标拖曳效果
Oct 09 Javascript
JS操作XML实例总结(加载与解析XML文件、字符串)
Dec 08 Javascript
一款简单的jQuery图片标注效果附源码下载
Mar 22 Javascript
浅谈javascript运算符——条件,逗号,赋值,()和void运算符
Jul 15 Javascript
JS键盘版计算器的制作方法
Dec 03 Javascript
React Native悬浮按钮组件的示例代码
Apr 05 Javascript
详解用vue2.x版本+adminLTE开源框架搭建后台应用模版
Mar 15 Javascript
jQuery的实现原理的模拟代码 -1 核心部分
Aug 01 #Javascript
jQuery validate 中文API 附validate.js中文api手册
Jul 31 #Javascript
jQuery对象[0]是什么含义?
Jul 31 #Javascript
动态调用CSS文件的JS代码
Jul 29 #Javascript
date.parse在IE和FF中的区别
Jul 29 #Javascript
iframe自适应宽度、高度 ie6 7 8,firefox 3.86下测试通过
Jul 29 #Javascript
jquery中对表单的基本操作代码
Jul 29 #Javascript
You might like
php模板函数 正则实现代码
2012/10/15 PHP
php强制文件下载而非在浏览器打开的自定义函数分享
2014/05/08 PHP
php.ini save_handler 修改不生效的解决办法
2014/07/22 PHP
PHP实现百度人脸识别
2019/05/06 PHP
文件编码导致jquery失效的解决方法
2013/06/26 Javascript
javascript实现PC网页里的拖拽效果
2016/03/14 Javascript
javascript面向对象程序设计高级特性经典教程(值得收藏)
2016/05/19 Javascript
快速掌握jquery分页插件jqPaginator的使用方法
2017/08/09 jQuery
node+express+ejs使用模版引擎做的一个示例demo
2017/09/18 Javascript
vue.js根据代码运行环境选择baseurl的方法
2018/02/28 Javascript
jquery ajax加载数据前台渲染方式 不用for遍历的方法
2018/08/09 jQuery
mockjs+vue页面直接展示数据的方法
2018/12/19 Javascript
vue-父子组件和ref实例详解
2019/11/10 Javascript
微信小程序swiper实现文字纵向轮播提示效果
2020/01/21 Javascript
Java Varargs 可变参数用法详解
2020/01/28 Javascript
js 获取扫码枪输入数据的方法
2020/06/10 Javascript
Python中使用装饰器来优化尾递归的示例
2016/06/18 Python
利用python画一颗心的方法示例
2017/01/31 Python
Tensorflow 训练自己的数据集将数据直接导入到内存
2018/06/19 Python
python得到单词模式的示例
2018/10/15 Python
python3 实现对图片进行局部切割的方法
2018/12/05 Python
python 利用jinja2模板生成html代码实例
2019/10/10 Python
python的sys.path模块路径添加方式
2020/03/09 Python
python requests.get带header
2020/05/05 Python
Python排序函数的使用方法详解
2020/12/11 Python
CSS3教程:background-clip和background-origin
2008/10/17 HTML / CSS
含精油的天然有机化妆品:Indemne
2019/08/27 全球购物
高级销售员求职信
2013/10/25 职场文书
优秀经理事迹材料
2014/02/01 职场文书
银行批评与自我批评
2014/02/10 职场文书
新闻编辑自荐书范文
2014/02/12 职场文书
关于学习的演讲稿
2014/05/10 职场文书
撤诉申请书法院范本
2015/05/18 职场文书
让子弹飞观后感
2015/06/11 职场文书
2016年法制宣传月活动总结
2016/04/01 职场文书
解决Golang time.Parse和time.Format的时区问题
2021/04/29 Golang