- 浏览: 102569 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
xwpxcom:
Springmvc学习笔记一(maven项目创建与配置) -
leaow567:
表达不严谨“用户自定义的ClassLoader有ExtClas ...
openfire源码解读第一节----ClassLoader的认识与理解 -
leaow567:
顶起!一起学习
openfire源码解读第一节----ClassLoader的认识与理解 -
xs.cctv:
信科
Springmvc学习笔记一(maven项目创建与配置) -
ywbrj042:
我们也在用这个,也在看openfire的源代码。以后可以一起交 ...
openfire源码解读第一节----ClassLoader的认识与理解
模仿jQuery,设计了一个缓存系统。像jQuery.data这样的东西,Prototype与mootools也有,目的都是用来辅助事件系统,用来缓存其中生成的数据,而非缓存普通函数上次计算的结果。Prototype利用了它的Hash类,mootools没细看,它内部好像用来缓存
uuid。一个共识是,为页面用到的元素设置uuid非常有用,要查找元素时,可以避免重复查找,也可以用于与事件回调函数相绑定。由于uuid目前只有
IE支持,它叫做uniqueID,格式为ms__id\d+,后面的数字也有名堂,叫做uniqueNumber。jQuery那个算是
uniqueNumber吧,而且它的缓存系统非常复杂,支持缓存单个数据(利用data这个读写方法)与一组数据(利用queue,删除用
dequeue)。没办法,因为它是白手起家,没有像Prototype那样利用一个自定数据类型分担一下职责。是时候进入正题,说一下我的缓存系统了。它利用到我的超级数组对象,实现像queue与dequeue。但我的超级数组对象能做的事更多,像filter,forEach,map,reduce,one,toObject,contains,remove等一应俱全。
dom.eventTypes
= dom.array(String("abort blur change click contextmenu \
dblclick error focus keydown keypress keyup load mousedown \
mouseenter mouseup mouseleave mousemove mouseover mouseout \
reset resize select submit unload").match(/\w+/g));
//******************************缓存系统***********************
dom.mixin({
uuid : 0,
storage: {},
buildCache:function(item){
var key,cache = dom.storage;
//如果是window
if ( item.setInterval && ( item !== window
&& !item.frameElement )) {
key = "dom-window"
}else if(item.nodeType){
if(!item.uuid){
item.uuid = "dom" + dom.uuid++
dom.cache("uuid","uuid-set",item);//保存元素的引用
}//如果当前元素没有uuid这属性,那么为它添加一个
key = item.uuid
}else if(dom.isString(item)){
key = item;
}else{
throw "item must be element node ,window or
string"
}
if(!cache[key]){
cache[key]
= {};
}
return cache[key]
},
cache:function(item,name,data){//读写缓存
var cache =
dom.buildCache(item);
if(data !== undefined){
if(dom.isFunction(data)){//缓存函数,在函数设置一个uuid,生成方式取其toString()并去掉空白
var uuid = (data+"").replace(/\s+/g,'');
data.uuid =
uuid;
}
if(!cache[name]){
//set与list允许缓存一组数据,
//其中如果带有-set后缀允许其中的元素重复,list则不允许
if(/-set$/.test(name)){//如果是第一次存储
cache[name] =
array(data);
cache[name].type = "set";
}else if(/-list$/.test(name)){//
cache[name] =
array(data);
cache[name].type = "list";
}else{
cache[name] = data;
}
}else{
var type =
cache[name].type;
if(type && type === "set"
){
cache[name].ensure(data)
}else
if(type && type === "list" ){
cache[name].push(data)
}else{
cache[name] = data;
}
}
return item;
}else{
return cache[name]
}
},
//参数可以为1,2,3
removeCache:function(item,name,data){
if(!arguments.length)
return;
var cache = dom.buildCache(item),isDOM =
!!item.nodeType;
if(isDOM &&
dom.eventTypes.contains(name)){
name = name +
"-handlers-list";
};
if(arguments.length ===
3){//移除指定的data
if(cache[name] instanceof dom.array &&
cache[name].length > 0){
//对于由事件绑定函数构成的超级数组,我们在缓存它的时候为每个函数设置了一个uuid
//现在我们比较现在传入的函数的uuid与超级数组中的某个元素的uuid是否相等
//如果有我们将得它的引用,有了它我们才能使用remove方法移除它。
if(dom.isFunction(data)){
var uuid =
(data+"").replace(/\s+/g,''),
fn =
cache[name].one(function(fn){
return fn.uuid ==
uuid;
});
if(fn){
cache[name].remove(fn);
}
}else{
cache[name].remove(data);
}
if(cache[name].length ===
0)
dom.removeCache(item,name);
}else{
dom.removeCache(item,name);
}
}else if(arguments.length === 2){//移除条目
delete
cache[name]
if(!dom.isExtensible(cache)){
dom.removeCache(item);
}
}else {
delete cache;
if(isDOM){
dom.removeCache("uuid","uuid-set",item);
dom.removeAttr(item,"uuid");
}
}
},
clearCache:function(){
var cache =
dom.buildCache("uuid","uuid-set");
if(!cache)
return;//如果为空直接返回
cache.forEach(function(el){
dom.removeAttr(el,"uuid");
});
dom.storage =
null;
}
});
buildCache是用于在dom.storage上开辟一个命名空间,cache用于在命名空间存储各种数据,可以为单个数据,一组数据,一组数据又分为list与set两种,区别是允许元素是否重复,重复的list相重于jQuery.queue设置的数组。对于window对象的处理,jQuery是在闭包内搞了一个windowData,我则它为在dom.storage开辟了一个名为dom-window的空间。
removeCache相当于jQuery.removeData与jQuery.unquere,但功能还要强大,能根据传入参数的个数选用不同的功能。clearCache则直接删除所有缓存。
值得注意的是,在IE中为DOM元素设置私有属性会引起内存泄漏,所有在页面unload时需要手动去除它们。各大类库也是这样做了,dom.cache("uuid","uuid-set",item)就是用于unload时取出所有设置过uuid的元素,一一去掉其uuid。不过实际上,调用clearCache方法就可以了。
发表评论
-
文本框只允许输入中文
2012-05-26 18:35 1060群友写的 顺手牵羊 保存了 只能输入中文:<in ... -
最新的qq号的验证
2012-05-18 22:43 718!/^[1-9]\d{4,9}$/.test("45 ... -
javaScript设计模式中的掺元类
2012-04-22 10:01 1358今天虽然周末但是没有撒懒,因为媳妇要上班所以我得送她下去,一方 ... -
JS递归将字符串中的字符替换为目标字符
2011-04-06 21:43 951//repStr:原字符串--rgExp:被替换的字符-- ... -
浮点计算方法
2011-01-20 12:57 917//浮点数加法运算 function FloatAdd(a ... -
JavaScript使用技巧精萃
2011-01-15 17:23 845(一).确认删除用法: 1. BtnDel.A ... -
JavaScript判断是否为数组
2011-01-15 17:17 848判断一个对象是否为数组比较麻烦,以下是我收集的各种版本 Do ... -
JavaScript通用的加入收藏夹代码
2011-01-15 17:15 1070<script type="text/jav ... -
jQuery对下拉框、单选框、多选框的处理
2011-01-15 17:13 1126下拉框: //得到 ... -
Firefox和IE之间7个JavaScript的差异
2011-01-15 17:12 702尽管 Java Script 历史上使用冗长而令人生厌的 ... -
JavaScript语法中12个需要绕开的陷阱
2011-01-15 17:10 7161. == Java script有两组 ... -
JavaScript类和继承:this属性
2011-01-15 17:04 788this属性表示当前对象,如果在全局作用范围内使用thi ... -
JavaScript类和继承:prototype属性
2011-01-15 17:03 741我们已经在第一章中使用prototype属性模拟类和继承的实现 ... -
JavaScript类和继承:constructor属性
2011-01-15 17:02 681constructor属性始终指向创建当前对象的构造函数。比 ... -
浅析Javascript闭包的特性
2011-01-15 17:01 702Java script闭包的定义非常晦涩——闭包,是指语法域 ... -
浅谈不用Cookie实现高亮Javascript菜单效果
2011-01-15 17:00 972笔者经常采用的高亮Java script菜单效果设计方式,一 ... -
10个最常用的JavaScript自定义函数
2011-01-15 16:57 958Java Script自定义函数在平时的开发过程中比较实用, ... -
详解JavaScript中的Array扩展
2011-01-15 16:54 714Java script中的Array扩展,一般都是从 ... -
JavaScript常用的2种定义类的方式
2011-01-15 16:51 6691. 混合构造函数/原型方式 functio ... -
使用jQuery制作滑动动画效果的层
2011-01-15 16:43 775基本原理 这些具有动态效果的滑动盒都基于同样的基本原理。 ...
相关推荐
JavaScript缓存区分析是Web开发中的一个重要概念,尤其是在性能优化和大数据处理方面。在这个话题中,我们将深入探讨JavaScript如何管理内存,以及如何利用缓存机制提高应用程序的运行效率。 首先,我们要理解...
【C# 系统缓存全解析】 系统缓存是一种优化技术,用于提高应用程序的性能,减少对资源的不必要消耗。在C# .NET环境中,缓存是至关重要的,尤其是在处理大量数据或频繁数据库查询时。缓存分为客户端缓存和服务器端...
通过缓存部分数据、预加载结果或采用异步处理,可以提高系统的响应速度和并发处理能力。 9. **用户交互体验**:良好的动画效果和反馈能够提升用户体验。例如,可以设计一个旋转的转盘动画,在抽奖过程中显示转动...
缓存能够存储网页的静态资源,如图片、CSS样式表和JavaScript文件,以提高页面加载速度,提升用户体验。然而,有时为了调试或者隐私考虑,我们需要清除这些缓存。本文将详细介绍如何使用Chrome扩展程序以及...
基于预测的JavaScript类型系统研究 本文研究了基于预测的JavaScript类型系统,旨在解决JavaScript动态类型语言的性能瓶颈问题。JavaScript语言的动态类型特性使得其性能优化非常困难,因此研究人员提出了两种基于...
标题中的“成绩管理系统 javascript”指的是一个使用JavaScript编程语言开发的成绩管理软件系统。JavaScript是一种广泛用于网页和网络应用的脚本语言,它允许在用户浏览器端进行动态内容的创建和更新,提高了网页的...
从“JavaScript开发-其它杂项”的标签来看,这个轻量缓存系统可能是开发者自己实现的一个通用工具库,或者是一个开源项目,旨在解决JavaScript开发中与缓存相关的常见问题,而不是依赖于特定的框架或库。 至于文件...
在本毕业设计项目中,我们将探讨如何利用JavaScript和CSS这两种重要的前端开发技术来构建一个功能完善的电商系统。JavaScript是Web开发中的动态脚本语言,主要负责网页的交互性和动态效果,而CSS则用来进行样式控制...
通过结合`include`属性和Vuex,我们可以构建一个灵活且可控的缓存管理系统,确保组件的缓存状态能根据应用的需求进行动态调整。在实际开发中,理解和掌握这种技巧对于优化用户体验和提升应用性能至关重要。
在这段关于JavaScript数据缓存系统的描述中,首先给出了一个关键性的定义,即数据缓存系统的作用是临时存放可复用数据,并在数据后续的使用中能够快速地重新调用。这个概念对于Web开发和前端优化是非常重要的,因为...
LiquidCache,正如其名,是针对Angular2/6设计的一个强大、自动化且优化的缓存系统。它旨在解决在处理大量数据时的性能问题,通过智能地存储和检索数据来提升用户体验。 **Angular2/6中的缓存需求** 在Angular2/6...
【帝国CMS清理动态缓存插件】是一款专为帝国CMS内容管理系统设计的辅助工具,旨在优化网站性能,提高用户体验。在动态网站中,缓存技术是必不可少的,它能够存储频繁访问的数据,减少数据库的负担,加快页面加载速度...
js缓存系统是一种基于JavaScript实现的数据存储解决方案,它可以在客户端(通常是浏览器)上存储数据,以便在后续请求或页面加载时快速访问,避免了不必要的网络请求,从而大大提高了应用的响应速度。这种缓存机制...
在这个系统中,JavaScript 负责处理用户的输入和页面的实时更新。例如,通过 AJAX 技术实现异步数据请求,用户可以在不刷新整个页面的情况下获取和更新商品信息。JavaScript 还用于验证用户输入,如注册登录时的表单...
浏览器缓存是Web浏览过程中的一个重要部分,它存储了用户访问过的网页资源,如图片、JavaScript文件和CSS样式表等,以减少网络延迟,提升用户体验。在负载测试中,正确配置浏览器缓存能帮助我们更好地模拟真实的用户...
在互联网浏览过程中,浏览器为了提高页面加载速度和用户体验,会自动将部分网页资源如图片、JavaScript文件、CSS样式表等存储在本地缓存中。这些缓存文件对于普通用户来说通常是不可见的,但通过特定工具,我们可以...
【JavaScript错题系统详解】 在当今的在线教育领域,错题系统已经成为提升学习效率的重要工具。基于JavaScript开发的错题系统充分利用了JavaScript的动态特性和丰富的库资源,为用户提供了一个功能强大、交互友好的...
ASP.NET 的缓存系统分为两种主要类型:页面输出缓存和数据缓存。页面输出缓存将整个HTML页面存储在内存中,当相同的请求再次到达时,可以直接从缓存中提供页面,而无需重新生成。数据缓存则主要用于存储应用程序中...
为了更高效地利用内存,可以考虑实现分级缓存,比如结合Redis或Memcached等分布式缓存系统,将Tomcat缓存作为第一级,分布式缓存作为第二级,提高缓存的命中率和可扩展性。 #### 3.2 缓存策略调整 根据应用的访问...
在本项目中,"javascript房屋销售系统"是一个基于JavaScript技术构建的应用,主要用于管理房屋销售相关的数据和业务流程。JavaScript作为客户端脚本语言,通常用于增强网页的交互性和动态功能,而在这个系统中,它...