当前位置: 首页 > 编程笔记 >

jQuery的缓存机制浅析

白和泽
2023-03-14
本文向大家介绍jQuery的缓存机制浅析,包括了jQuery的缓存机制浅析的使用技巧和注意事项,需要的朋友参考一下

前不久在研究jQuery的动画队列的时候,发现jQuery的缓存系统也很强大,尽管以前也稍微接触过,但一直都没有深入研究过。jQuery的缓存系统在外部应用的时候都比较简单,比如要将某个URL数据存到缓存中只要这么写:

var val = "stylechen.com";
$("div").data( "url" ); // 返回undefined
$("div").data( "url", val ); // 返回"stylechen.com"
$("div").data( "url" ); // 返回"stylechen.com"

不光可以存储字符串,上面的val也可以是任意数据,对象、数组、函数等都可以存到里面。仅仅实现这种功能还是挺简单的,声明一个全局对象用来存储数据,然后使用data方法来存储或返回数据:

var cacheData = {}; // 用来存储数据的全局对象
var data = function( key, val ){
 if( val !== undefined ){
  cacheData[key] = val;
 }

 return cacheData[key]; }; 

jQuery缓存系统的真正魅力在于其内部应用中,动画、事件等都有用到这个缓存系统。之前在写easyAnim的时候,我将动画的队列都存储到各DOM元素的自定义属性中,这样虽然可以方便的访问队列数据,但也同时带来了隐患。如果给DOM元素添加自定义的属性和过多的数据可能会引起内存泄漏,所以要尽量避免这么干。

如果是使用jQuery的缓存系统来存放DOM元素的数据,会先给该DOM元素添加一个随机生成的属性,这个属性用来存放访问缓存数据的索引值,就好比DOM元素都有一把开启缓存保险箱的钥匙,只要有了钥匙就可以随时开启缓存保险箱。将本来存放到DOM元素中的数据都转到了缓存中,而DOM元素本身只要存储一个简单的属性就可以了,这样就可以将由DOM元素引起的内存泄漏的风险规避到最小。下面是我模拟jQuery自己写的一个简单的缓存系统:

var cacheData = {}, // 用来存储数据的全局对象
 uuid = 0,
 // 声明随机数
 expando = "cacheData" ( new Date() "" ).slice( -8 ); 

var data = function( key, val, data ){
 if( typeof key === "string" ){
  if( val !== undefined ){
   cacheData[key] = val;
  }

  return cacheData[key];  }  else if( typeof key === "object" ){   var index,    thisCache;   if( !key[expando] ){    // 添加一个DOM元素的属性    // 随机数是属性名 索引值是属性值    index = key[expando] = uuid;    thisCache = cacheData[index] = {};   }   else{    index = key[expando];    thisCache = cacheData[index];   }      if( !thisCache[expando] ){    thisCache[expando] = {};   }   if( <a href="http://jb51.net">gambling</a> data !== undefined ){    // 将数据存到缓存对象中    thisCache[expando][val] = data;   }   // 返回DOM元素存储的数据   return thisCache[expando][val];  } };

var removeData = function( key, val ){  if( typeof key === "string" ){   delete cacheData[key];  }  else if( typeof key === "object" ){   if( !key[expando] ){    return;   }   // 检测对象是否为空   var isEmptyObject = function( obj ) {     var name;     for ( name in obj ) {      return false;     }     return true;    },    removeAttr = function(){     try{      // IE8及标准浏览器可以直接使用delete来删除属性      delete key[expando];     }     catch (e) {      // IE6/IE7使用removeAttribute方法来删除属性      key.removeAttribute(expando);     }    },    index = key[expando];   if( val ){    // 只删除指定的数据    delete cacheData[index][expando][val];    // 如果是空对象 索性全部删除    if( isEmptyObject( cacheData[index][expando] ) ){     delete cacheData[index];     removeAttr();    }   }   else{    // 删除DOM元素存到缓存中的所有数据    delete cacheData[index];    removeAttr();   }  } };


上面的代码值得注意的是IE6/IE7中用delete来删除自定义的属性会报错,只能使用removeAttribute来删除,标准的浏览器都可以使用delete来删除。下面是调用的结果:

var box = document.getElementById( "box" ),
 list = document.getElementById( "list" );

data( box, "myName", "chen" );
alert( data( box, "myName" ) ); // chen

data( box, "myBlog", "stylechen.com" ); alert( data( box, "myBlog" ) ); // stylechen.com

removeData( box, "myBlog" );

alert( data( box, "myBlog" ) ); // undefined alert( data( box, "myName" ) ); // chen alert( box[expando] ); // 1

removeData( box ); alert( box[expando] ); // undefined

当然,jQuery的缓存系统比我的这个要复杂些,不过核心原理还是一样的。easyAnim将会在后续的版本中引入这个缓存系统。

 类似资料:
  • 本文向大家介绍浅谈Django的缓存机制,包括了浅谈Django的缓存机制的使用技巧和注意事项,需要的朋友参考一下 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之

  • 本文向大家介绍smarty缓存机制?相关面试题,主要包含被问及smarty缓存机制?时的应答技巧和注意事项,需要的朋友参考一下 如果开启了缓存,smarty同时生成一份静态的html页面,如果在设定的时间没有过期,再次访问的时候,你访问的就是是html文件了,减少了读取数据库,所以就效率来说,要高一些。

  • 由于GitBlog没有数据库,是依靠解析posts文件夹中的markdown文件来展示表客数据的。通常我们写好一篇博客以后,对其进行修改的频率并不高。GitBlog没必要每次访问页面时,都去解析markdown文件。基于这个理由,GitBlog对数据进行了缓存,GitBlog的缓存有三个层面的实现。 三层缓存机制 三层缓存机制由上至下依次是: HTML页面缓存 Twig模板缓存 PHP数据缓存 所

  • 页面url概述 WeX5/BeX5系统中,UIServer是提供界面展现的服务,一个页面一般对应的是.w文件。一个完整的页面url如“http://x5.justep.com:8080/x5/UI2/takeout/index.w”,其中x5是UIServer的web应用名(在tomcat的server.xml查看,可以根据需要自行修改名字),8080是tomcat的http服务端口号,UI2/t

  • 页面url概述 WeX5/BeX5系统中,UIServer是提供界面展现的服务,一个页面一般对应的是.w文件。一个完整的页面url如“http://x5.justep.com:8080/x5/UI2/takeout/index.w”,其中x5是UIServer的web应用名(在tomcat的server.xml查看,可以根据需要自行修改名字),8080是tomcat的http服务端口号,UI2/t

  • phpGrace 缓存机制说明 在项目开发过程中我们经常会利用缓存来缓解数据查询、复杂运算带来的服务器压力以应对高并发! phpGrace 封装了简洁高效的缓存方案,支持文件、memcache、redis三种形式的缓存方式。 设置缓存类型及相关配置 /phpGrace/config.php(全局配置) <?php return array( // ...... //支持的缓存类型