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 相关文章推荐
汉化英文版的Dreamweaver CS5并自动提示jquery
Nov 25 Javascript
javascript动态加载二
Aug 22 Javascript
js不能跳转到上一页面的问题解决方法
Mar 01 Javascript
jquery.messager.js插件导致页面抖动的解决方法
Jul 14 Javascript
浅析JavaScript中的常用算法与函数
Nov 21 Javascript
js时间戳转为日期格式的方法
Dec 28 Javascript
Vue.js实现一个自定义分页组件vue-paginaiton
Sep 05 Javascript
JS求解三元一次方程组值的方法
Jan 03 Javascript
easyui combogrid实现本地模糊搜索过滤多列
May 13 Javascript
Angular 4依赖注入学习教程之ValueProvider的使用(七)
Jun 04 Javascript
Canvas实现微信红包照片效果
Aug 21 Javascript
微信小程序生成分享海报方法(附带二维码生成)
Mar 29 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中限制IP段访问、禁止IP提交表单的代码
2011/04/23 PHP
教你如何快捷的使用cmd访问mysql小技巧
2014/05/26 PHP
PHP不用递归遍历目录下所有文件的代码
2014/07/04 PHP
php+mysqli使用预处理技术进行数据库查询的方法
2015/01/28 PHP
PHP反射实际应用示例
2019/04/03 PHP
PHP使用ActiveMQ实现消息队列的方法详解
2019/05/31 PHP
JavaScript事件列表解说
2006/12/22 Javascript
jQuery :nth-child前有无空格的区别分析
2011/07/11 Javascript
Nodejs异步回调的优雅处理方法
2014/09/25 NodeJs
JavaScript实现彩虹文字效果的方法
2015/04/16 Javascript
JavaScript实现梯形乘法表的方法
2015/04/25 Javascript
jQuery的bind()方法使用详解
2015/07/15 Javascript
CSS+jQuery实现简单的折叠菜单
2016/12/20 Javascript
jQuery插件jquery.kxbdmarquee.js实现无缝滚动效果
2017/02/15 Javascript
axios学习教程全攻略
2017/03/26 Javascript
vue修改vue项目运行端口号的方法
2017/08/04 Javascript
详解关于vue2.0工程发布上线操作步骤
2018/09/27 Javascript
vue 搭建后台系统模块化开发详解
2019/05/01 Javascript
Node使用Selenium进行前端自动化操作的代码实现
2019/10/10 Javascript
Vue实现可移动水平时间轴
2020/06/29 Javascript
Jquery+javascript实现支付网页数字键盘
2020/12/21 jQuery
c++生成dll使用python调用dll的方法
2014/01/20 Python
Python实现的微信公众号群发图片与文本消息功能实例详解
2017/06/30 Python
Python实现简单求解给定整数的质因数算法示例
2018/03/25 Python
python版飞机大战代码分享
2018/11/20 Python
python使用Windows的wmic命令监控文件运行状况,如有异常发送邮件报警
2021/01/30 Python
Python3+SQLAlchemy+Sqlite3实现ORM教程
2021/02/16 Python
python实现b站直播自动发送弹幕功能
2021/02/20 Python
Pam & Gela官网:美国性感前卫女装品牌
2018/07/19 全球购物
大学生饮食连锁店创业计划书
2014/01/17 职场文书
中学生旷课检讨书模板
2014/10/08 职场文书
2014年档案管理员工作总结
2014/12/01 职场文书
应用最多的公文《通知》如何写?
2019/04/02 职场文书
高考升学宴主持词
2019/06/21 职场文书
签证扫盲贴,41个常见签证知识,需要的拿走
2019/08/09 职场文书
canvas多重阴影发光效果实现
2021/04/20 Javascript