얼마 전 jQuery의 애니메이션 대기열을 연구하면서 jQuery의 캐싱 시스템도 매우 강력하다는 사실을 발견했습니다. jQuery의 캐싱 시스템은 외부에서 사용할 때 비교적 간단합니다. 예를 들어 특정 URL 데이터를 캐시에 저장하려면 다음과 같이 작성하면 됩니다.
}
JQuery의 캐싱 시스템을 사용하여 DOM 요소의 데이터를 저장하는 경우 무작위로 생성된 속성이 DOM 요소에 먼저 추가됩니다. 이 속성은 DOM과 마찬가지로 캐시된 데이터에 액세스하기 위한 인덱스 값을 저장하는 데 사용됩니다. 요소에 열려 있는 열쇠가 있습니다. 캐시 금고의 열쇠가 있으면 언제든지 캐시 금고를 열 수 있습니다. 원래 DOM 요소에 저장된 데이터는 캐시로 옮겨지고, DOM 요소 자체는 간단한 속성만 저장하면 되므로 DOM 요소로 인한 메모리 누수 위험을 최소화할 수 있습니다. 다음은 jQuery를 시뮬레이션하기 위해 작성한 간단한 캐싱 시스템입니다.
return cashData[key];
}
else if( typeof key === "object" ){
var index,
thisCache;
if( !key [expando] ){
// DOM 요소의 속성 추가
// 난수는 속성 이름이고 인덱스 값은 속성 값
index = key[expando] = uuid;
thisCache = 캐시Data[ index] = {};
}
else{
index = key[expando];
thisCache = 캐시Data[index];
}
if( !thisCache[expando] ){
thisCache[expando] = {};
}
if( gambling // 캐시 객체에 데이터 저장
thisCache[expando][val] = data;
}
// 저장된 DOM 요소 반환 Data
return thisCache[expando][val];
}
};
var RemoveData = function( key, val ){
if( typeof key === "string" ){
delete cashData[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 캐시Data[index][expando][val];
// 빈 객체라면 그냥 모든 객체 삭제
if( isEmptyObject( 캐시Data[index] [expando] ) ){
delete cashData[index];
RemoveAttr();
}
}
else{
// DOM 요소에 대해 캐시에 저장된 모든 데이터를 삭제합니다.
캐시 데이터 삭제[index];
RemoveAttr();
}
}
};
위 코드에서 주목할 만한 점은 IE6/IE7에서 사용자 정의 속성을 삭제하기 위해 삭제를 사용하면 오류가 보고된다는 점입니다. 표준 브라우저에서는 삭제를 사용하여 삭제할 수 있습니다. 호출 결과는 다음과 같습니다.
data( box, "myBlog", "stylechen.com" );
alert( data( box, "myBlog" ) ) // stylechen.com
removeData( 상자, "myBlog" );
alert( data( box, "myBlog" ) ); // 정의되지 않음
alert( data( box, "myName" ) ) // chen
alert( box[expando] );
removeData( box );
alert( box[expando] ) // 정의되지 않음
물론 jQuery의 캐싱 시스템은 저보다 더 복잡하지만 핵심 원칙은 여전히 동일합니다. easyAnim은 후속 버전에서 이 캐싱 시스템을 도입할 것입니다.