`
晨曦的朝阳
  • 浏览: 10477 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

jQuery1.7系列二: jQuery的缓存机制

阅读更多

 

      声明:写博客,是对自身知识的一种总结,也是一种分享,但由于作者本人水平有限,难免会有一些地方说得不对,还请大家友善  指出,或致电:tianzhen.chen0509@gmail.com

      关注:国内开源jQuery-UI组件库:Operamasks-UI

      jQuery版本:v1.7.1

 

jQuery1.7系列二:  jQuery的缓存机制

一.缓存的基本原理

 

1.      缓存的作用

 

        在前端的开发中,很多时候需要存储一些跟dom节点相关的数据,于是jQuery内部实现了一个缓存,用于存储跟dom节点相关的数据,包括事件,动画等都会用到。

 

 

2.      缓存的类别

 

        jQuery中的缓存可以分为两大类别:全局缓存和局部缓存。全局缓存存储直接与dom节点相关的数据,局部缓存存储与js对象相关的数据。

 

 

3.      两大缓存的实现原理

 

3.1      全局缓存

 

         全局缓存定义为:jQuery.cache = {} ,它就是一个普通的js对象,jQuery暴露了两个最基本的接口用来与全局缓存进行通信,分别是  jQuery.fn.data 和  jQuery.fn.removeData 。那么内部是如何实现数据与dom节点一一对应的?先看如下图:


 

         当我们第一次执行$(“#div1”).data(“a”, 10)时,jQuery会为 #div1 这个dom节点添加一个属性,名字为expando的计算结果,它是具有唯一性的。然后 expando属性对应的值 id1 就是该节点在全局缓存$.cache中对应的key了,另外要注意,数据是存储在data变量中的,它表示这些数据是用户自己定义的,如果是jQuery 核心需要用到的数据,它不会放到data里边,而是直接放在“id1”这个key表示的对象下边。如下图:


以上便是全局缓存$.cache中的数据存放结构了,而暴露出来的接口不外乎就是进行添加与删除。

 

3.2      局部缓存

 

        jQuery源码中说到,如果是要把数据与js对象(非HTML Node对象)进行关联,更省事的办法是直接绑定在对象上,而全局缓存的出现主要是为了处理IE中内存的泄露问题。我们做一下例子看一看:

 

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="jquery-1.7.1.js"></script>
<script>
	$(function(){
		$test = $("#test");
		$.data( $test , "c" , 20);
		console.log("end");
	});
</script>
</head>
<body>
	<div id="test">123</div>
</body>
</html>
 

 

代码非常简单,我在console.log(“end”)给打上断点,截图如下:


 

 

        可以看到,局部缓存是直接存储在js对象上的,而且放在js对象的expando属性下边的data属性上。

 

二.缓存对html5的属性支持

 

        Html5规范中新增了 data-*  这样的html元素自定义属性,它可以给页面创建者本身的脚本进行使用。举个例子:

<ol>
 <li data-length="2m11s">Beyond The Sea</li>
 ...
</ol>
 

 

        为了标识每首歌曲的长度,供用户排序歌曲时使用,可以添加data-length这样的自定义属性,它在本页面内会使用到。但是data-length 这样的属性并不适用于如使用网页爬虫这样的外部程序来使用。


       为了更方便的访问这一些 data-* 属性,jQuery内部进行了特殊处理,当我们执行$(“#div1”).data(“a”);这样的代码来获取缓存值时,jQuery会尝试从全局缓 存$.cache来进行查找,如果查找不到值的话,会再尝试着查找 data-a 这样的html元素属性值,接下来我们做个实验:

 

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="jquery-1.7.1.js"></script>
<script>
	$(function(){
		$test = $("#test");
		console.log($test.data("alias"));//会打印出"alias"
	});
</script>
</head>
<body>
	<div id="test" data-alias="alias">123</div>
</body>
</html>
 

 

当执行后我们看下结果:



 

在控制台上确实打印出了“alias” ,说明找到了”alias”属性。注意,当jQuery从html元素的data-*属性找到值时,会把值复制到全局缓存$.cache中的。

 

三.缓存与事件

 

         jQuery在进行缓存事件的操作时,提供了三个事件监听,分别是 getData, setData和changeData,做一个例子测试一下:

 

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="jquery-1.7.1.js"></script>
<script>
	$(function(){
		$test = $("#test");
		$test.bind("getData" ,function(){
			console.log("getData");
		})
		.bind("setData" , function(){
			console.log("setData");
		}).bind("changeData" , function(){
			console.log("changeData");
		});
		$test.data("name" , "xisi");//打印  "setData" "changeData"
		$test.data("name");//打印"getData"
	});
</script>
</head>
<body>
	<div id="test">123</div>
</body>
</html>
 

 

 


cache事件一般用得比较少,估计做一些js组件库才会用到吧。

  • 大小: 40.3 KB
  • 大小: 23.2 KB
  • 大小: 34 KB
  • 大小: 26 KB
分享到:
评论

相关推荐

    JQuery新版中文手册

    JQuery开发手册 jQuery 核心函数 jQuery([sel,[context]]) jQuery(html,[ownerDoc]) jQuery(callback) jQuery.holdReady(hold)1.6+ jQuery 对象访问 each(callback) size() length selector context get...

    jQuery 参考手册 速查表

    jQuery 3.1 参考手册 jQuery 核心函数 jQuery([sel,[context]]) jQuery(html,[ownerDoc])1.8* jQuery(callback) jQuery.holdReady(hold) jQuery 对象访问 each(callback) size() length selector context...

    jquery1.11.0手册

    jQuery 1.11.0 速查表 核心 jQuery 核心函数 jQuery([sel,[context]]) jQuery(html,[ownerDoc])1.8* jQuery(callback) jQuery.holdReady(hold) jQuery 对象访问 each(callback) size() length selector ...

    Simple-Log v1.7 build20190306

    多人联合撰写: 后台轻松完成多人联合撰写 完善的后台权限机制: 可以设置不同的会员组后台操作权限,再多的人访问后台联合撰写也没烦恼 完善的数据备份、恢复: 后台支持博客数据的备份和恢复Simple-Log v1.7 ...

    Simple-Log v1.7 build20190306.zip

    完善的后台权限机制: 可以设置不同的会员组后台操作权限,再多的人访问后台联合撰写也没烦恼 完善的数据备份、恢复: 后台支持博客数据的备份和恢复 Simple-Log v1.7 build20190306 更新日志 1.适配PHP7以上...

    MF00001-JAVA多用户B2B2C商城源码.zip

    JAVA多用户B2B2C商城系统源码 开发语言 : JAVA ...系统支持多服务器分布式部署,互通机制,也可以修改系统相关功能进行session缓存共享处理,轻松完成分布式部署,为大数据、大访问量的运营商提供可靠的功能保证。

    补丁DD8.1-130722-13年07月22日.zip

    修复jquery.validate.js在jquery1.7下不兼容问题 修复旧版插件优惠券无法修改搜索信息的bug 修复添加淘宝订单错误的问题 优化无返利类api自动定位会员 优化淘宝主key的使用 优化有返利类api下增加按找小时获取淘宝...

    多多返利V8.1升级包(FOR v8.0)_20130615

    jquery升级到1.7版本 集分宝提现增加最大5万条件限制(支付宝规定) 升级后遗症问题 1.使用点金模式不显示商品 解决办法: 1)淘宝基本管理里面选择无淘宝客初级包 点击保存这步没做 2)更新缓存没做 3)appkey...

    补丁DD8.1-130722-13年07月22日

    修复jquery.validate.js在jquery1.7下不兼容问题 修复旧版插件优惠券无法修改搜索信息的bug 修复添加淘宝订单错误的问题 优化无返利类api自动定位会员 优化淘宝主key的使用 优化有返利类api下增加按找小时获取淘宝...

    庖丁解牛:纵向切入ASP.NET 3.5控件和组件开发技术

    第1章 服务器控件概述及开发环境部署 .1 1.1 自定义服务器控件 1 1.2 服务器控件在软件开发过程中的作用 1 ...附录a .net 3.5技术教程系列——collection/asp.net ajax/ silverlight/jquery ...646

    庖丁解牛 纵向切入ASP.NET 3.5控件和组件开发 part1

    注意:由于文件大小为111MB,但本人的上传权限只有60MB,所以分开两部分压缩上传。解压前必须与part2一起解压。...附录a .net 3.5技术教程系列——collection/asp.net ajax/ silverlight/jquery ...646

    庖丁解牛 纵向切入ASP.NET 3.5控件和组件开发 part2

    注意:由于文件大小为111MB,但本人的上传权限只有60MB,所以分开两部分压缩上传。解压前必须与part2一起解压。...附录a .net 3.5技术教程系列——collection/asp.net ajax/ silverlight/jquery ...646

    Java学习笔记-个人整理的

    {1.7}方法}{26}{section.1.7} {1.8}运算符}{27}{section.1.8} {1.8.1}自增运算}{28}{subsection.1.8.1} {1.8.1.1}Postincrement}{28}{subsubsection.1.8.1.1} {1.8.1.2}Preincrement}{28}{subsubsection.1.8....

Global site tag (gtag.js) - Google Analytics