jQuery 数据缓存模块进化史详细介绍

2020-05-19 07:29:05易采站长站整理

try {
delete elem[ expando ];
} catch(e){
if ( elem.removeAttribute )
elem.removeAttribute( expando );
}//注销账户
delete jQuery.cache[ id ];
}
}
})

jQuery在1.2.3中添加了两个同名的原型方法data与removeData,目的是方便链式操作与集化操作。并在data中添加getData, setData的自定义事件的触发逻辑。
1.3中,数据缓存系统终于独立成一个模块data.js(内部开发时的划分),并添加了两组方法,命名空间上的queue与dequeue,原型上的queue与dequeue。queue的目的很明显,就是缓存一组数据,为动画模块服务。dequeue是从一组数据中删掉一个。

//jQuery1.3
  jQuery.extend({
   queue: function( elem, type, data ) {
   if ( elem ){
   type = (type || “fx”) + “queue”;
   var q = jQuery.data( elem, type );
   if ( !q || jQuery.isArray(data) )//确保储存的是一个数组
   q = jQuery.data( elem, type, jQuery.makeArray(data) );
   else if( data )//然后往这个数据加东西
   q.push( data );
   }
   return q;
   },
   dequeue: function( elem, type ){
   var queue = jQuery.queue( elem, type ),
   fn = queue.shift();//然后删掉一个,早期它是放置动画的回调,删掉它就call一下,
   // 但没有做是否为函数的判定,估计也没有写到文档中,为内部使用
   if( !type || type === “fx” )
   fn = queue[0];
   if( fn !== undefined )
   fn.call(elem);
   }
  })

fx模块animate方法的调用示例:

//each是并行处理多个动画,queue是一个接一个处理多个动画
  this[ optall.queue === false ? “each” : “queue” ](function(){ /*略*/})

在元素上添加自定义属性,还会引发一个问题。如果我们对这个元素进行拷贝,就会将此属性也会复制过去,导致两个元素都有相同的UUID值,出现数据被错误操作的情况。jQuery早期的复制节点实现非常简单,如果元素的cloneNode方法不会复制事件就使用cloneNode,否则使用元素的outerHTML,或父节点的innerHTML,用clean方法解析一个新元素出来。但outerHTML与innerHTML都会显式属性写在里面,因此需要用正则把它们清除掉。

  //jQuery1.3.2 core.js clone方法
  var ret = this.map(function(){
   if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
   var html = this.outerHTML;
   if ( !html ) {
   var div = this.ownerDocument.createElement(“div”);
   div.appendChild( this.cloneNode(true) );
   html = div.innerHTML;
   }
  
   return jQuery.clean([html.replace(/ jQueryd+=”(?:d+|null)”/g, “”).replace(/^s*/, “”)])[0];