声明:写博客,是对自身知识的一种总结,也是一种分享,但由于作者本人水平有限,难免会有一些地方说得不对,还请大家友善 指出,或致电: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
分享到:
相关推荐
8. **性能优化**:1.7版本在内部实现了更多的性能优化,如减少DOM操作次数、智能缓存等,使得JQuery在处理大量元素时更加高效。 这个CHM文档不仅涵盖了上述知识点,还可能包含详细的API参考、示例代码、故障排查等...
### jQuery UI 1.7:用户界面库的深入解析 #### 概述 《jQuery UI 1.7》是2009年由Packt Publishing出版的一本专著,旨在为Web开发者提供关于jQuery UI框架的深入理解与应用指导。本书由Dan Wellman撰写,其内容...
7. **$.data()**: 3.x版本对$.data()进行了优化,不再缓存DOM节点的属性,这可能会影响依赖这个机制的插件。 使用"jquery-migrate-3.3.2.js"后,这些改动会被适配,使得旧版插件能够在新版jQuery环境中正常工作。但...
JSONP、AJAX缓存和错误处理机制也得到了进一步完善。 总的来说,"jquery-1.7.1.js"和"jquery-1.7.1.min.js"是jQuery库的两个重要形态,分别服务于开发和生产环境。理解它们的区别与应用场景,对于熟练掌握jQuery并...
《jQuery 1.7开发手册》是一本针对jQuery 1.7版本的详细参考资料,它包含中英文双语,为开发者提供了全面的API文档、教程和实用示例,旨在帮助开发者深入理解和高效运用jQuery库。jQuery是JavaScript的一个库,极大...
JQuery开发手册 jQuery 核心函数 jQuery([sel,[context]]) jQuery(html,[ownerDoc]) jQuery(callback) jQuery.holdReady(hold)1.6+ jQuery 对象访问 each(callback) size() length selector context get...
jQuery 3.1 参考手册 jQuery 核心函数 jQuery([sel,[context]]) jQuery(html,[ownerDoc])1.8* jQuery(callback) jQuery.holdReady(hold) jQuery 对象访问 each(callback) size() length selector context...
- 避免在循环中使用jQuery选择器,可以先缓存结果。 - 使用`.delegate()`(jQuery 1.4.2+)或`.on()`(jQuery 1.7+)绑定事件,减少内存占用。 9. **兼容性与版本差异** - jQuery 1.2版本在现代浏览器中的兼容性...
Dojo提供了一套优化机制,包括层(Layers)、缓存(Caching)和压缩(Minification),帮助开发者减少网络传输量,提升页面加载速度。 总结,Dojo 1.7 API CHM文件包含了对Dojo库的详尽解释,无论是初学者还是经验...
jQuery 1.11.0 速查表 核心 jQuery 核心函数 jQuery([sel,[context]]) jQuery(html,[ownerDoc])1.8* jQuery(callback) jQuery.holdReady(hold) jQuery 对象访问 each(callback) size() length selector ...
on()方法是自jQuery 1.7版本起推荐的附加事件处理程序的方法。使用on()可以提高代码的一致性和可维护性,同时它还能更容易地实现事件委托。 在处理JavaScript代码时,应尽量精简函数,合并可以合并的代码段。例如,...
jQuery的核心在于其选择器机制,它允许开发者用简洁的语法选取DOM元素。例如,`$("#id")`用于选取ID为"id"的元素,`$(".class")`则选取所有class为"class"的元素。此外,`$("tag")`选取特定的HTML标签。 二、DOM...
多人联合撰写: 后台轻松完成多人联合撰写 完善的后台权限机制: 可以设置不同的会员组后台操作权限,再多的人访问后台联合撰写也没烦恼 完善的数据备份、恢复: 后台支持博客数据的备份和恢复Simple-Log v1.7 ...
本文将深入探讨如何使用jQuery的Ajax错误处理机制进行有效的调试,以及Ajax的相关参数设定,帮助你更好地理解和解决在实际项目中遇到的问题。 首先,当你在使用Ajax进行异步数据获取时,可能会遇到请求失败的情况。...
本文将围绕jQuery 1.2.6版本的源码进行深度解析,探讨其核心设计理念和实现机制。 首先,我们从整体结构上来看jQuery。它采用模块化设计,主要分为选择器(Selectors)、DOM操作(DOM Manipulation)、事件(Events...
完善的后台权限机制: 可以设置不同的会员组后台操作权限,再多的人访问后台联合撰写也没烦恼 完善的数据备份、恢复: 后台支持博客数据的备份和恢复 Simple-Log v1.7 build20190306 更新日志 1.适配PHP7以上...
JAVA多用户B2B2C商城系统源码 开发语言 : JAVA ...系统支持多服务器分布式部署,互通机制,也可以修改系统相关功能进行session缓存共享处理,轻松完成分布式部署,为大数据、大访问量的运营商提供可靠的功能保证。
- **缓存机制**:利用浏览器缓存机制减少重复加载同一页面的情况。 - **代码优化**:对于复杂的交互逻辑,考虑使用更高效的实现方式。 #### 六、API 介绍 - **核心方法与属性**: - **方法**: - `center()`: ...