Lorsque j'étudiais la file d'attente d'animation de jQuery il n'y a pas longtemps, j'ai découvert que le système de mise en cache de jQuery est également très puissant. Même si j'y ai déjà été exposé, je ne l'ai jamais étudié en profondeur. Le système de mise en cache de jQuery est relativement simple lorsqu'il est utilisé en externe. Par exemple, pour stocker certaines données d'URL dans le cache, écrivez simplement :
Non seulement il peut stocker des chaînes, mais la valeur ci-dessus peut également contenir n'importe quelle donnée, et des objets, tableaux, fonctions, etc. peuvent y être stockés. Il est assez simple d'implémenter cette fonction. Déclarez un objet global pour stocker des données, puis utilisez la méthode data pour stocker ou renvoyer des données :
Le vrai charme du système de mise en cache jQuery réside dans ses applications internes. Les animations, événements, etc. utilisent tous ce système de mise en cache. Lorsque j'écrivais easyAnim auparavant, je stockais la file d'attente d'animation dans les attributs personnalisés de chaque élément DOM. Bien que cela facilite l'accès aux données de la file d'attente, cela comportait également des dangers cachés. L'ajout d'attributs personnalisés et de trop de données aux éléments DOM peut provoquer des fuites de mémoire, alors essayez d'éviter de le faire.
return cacheData[key];
}
else if( typeof key === "object" ){
var index,
thisCache;
if( !key [expando] ){
// Ajouter un attribut d'un élément DOM
// Le nombre aléatoire est le nom de l'attribut et la valeur de l'index est la valeur de l'attribut
index = key[expando] = uuid;
thisCache = cacheData[ index] = {};
}
else{
index = key[expando];
thisCache = cacheData[index];
}
if( !thisCache[expando] ){
thisCache[expando] = {};
}
if( gambling // Stocker les données dans l'objet cache
thisCache[expando][val] = data;
}
// Renvoie l'élément DOM stocké Data
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;
}
// Vérifiez si l'objet est vide
var isEmptyObject = function( obj ) {
var name;
for ( name in obj ) {
return false;
}
return true;
},
removeAttr = function(){
try{
// IE8 et les navigateurs standards peuvent directement utiliser delete pour supprimer des attributs
delete key[expando];
}
catch (e) {
// Utilisation IE6/IE7 Méthode RemoveAttribute pour supprimer les attributs
key.removeAttribute(expando);
}
},
index = key[expando];
if( val ){
// Supprimez uniquement les données spécifiées
delete cacheData[index][expando][val];
// S'il s'agit d'un objet vide, supprimez simplement tous les objets
if( isEmptyObject( cacheData[index] [expando] ) ){
delete cacheData[index];
removeAttr();
}
}
else{
// Supprime toutes les données stockées dans le cache pour les éléments DOM
supprimer cacheData[index];
supprimerAttr();
}
}
};
Ce qu'il convient de noter à propos du code ci-dessus, c'est que l'utilisation de delete pour supprimer un attribut personnalisé dans IE6/IE7 signalera une erreur. Il ne peut être supprimé qu'à l'aide de deleteAttribute. Les navigateurs standard peuvent utiliser delete pour supprimer. Voici le résultat de l'appel :
data( box, "myBlog", "stylechen.com" );
alert( data( box, "myBlog" ) );
alert( data( box, "myBlog" ) ); // undefined
alert( data( box, "myName" ) ); // chen
alert( box[expando] );
alert( box[expando] ); // non défini