ホームページ > ウェブフロントエンド > jsチュートリアル > jQueryのソースコード解析メモ(6) jQuery.data_jquery

jQueryのソースコード解析メモ(6) jQuery.data_jquery

WBOY
リリース: 2016-05-16 18:06:00
オリジナル
988 人が閲覧しました

データ部分のコードは 1381 行目から始まります。コードの最初の重要な行:

コードをコピー コードは次のとおりです:

jQuery .extend( {
// データが保存される場所、キー実装コア
cache: { },
// ID の割り当てに使用されるシード
uuid: 0,
/ / 異なる jQuery インスタンスを区別するために、保存されたデータは、jQuery のバージョン番号が接頭辞として付けられた乱数をキーとして使用します。
expando: "jQuery" (jQuery.fn.jquery Math.random()).replace(/D/g, " "),
// 次の要素にはデータがありません: embed とアプレット (まだ生きていますか?)、Flash 以外のオブジェクト。
noData: {
"embed": true,
" object": "clsid:D27CDB6E-. AE6D-11cf-96B8-444553540000",
"applet": true
}
});

外部インターフェイスは 2 つを呼び出します内部関数: jQuery.data (elem, name, data, pvt) および jQuery.removeData(elem, name, pvt)。 RemoveData のロジックはデータと似ていますが、データが追加されるのに対し、removeData はデータを削除するために delete を使用するか null に設定される点が異なります。
データ セクションのコードは、JS オブジェクトと DOM オブジェクトのストレージを明確に区別しており、これは一部のブラウザーのメモリ リークの問題を解決するためです。以前のバージョンの IE では、DOM オブジェクトと JS オブジェクトの間で循環参照が発生すると、GC はそれを正しく処理できません。 「Internet Explorer のリーク パターンの理解と解決」を参照してください。 COM オブジェクトの場合、オブジェクト要素にはデータが含まれないように制限されているため、この問題は回避されます。
コードをコピー コードは次のとおりです。

data: function(elem, name, data , pvt) {
// noData で定義された要素に属する場合
if(!jQuery.acceptData(elem)) {
return;
}
var innerKey = jQuery.expando ,
getByName = typeof name === "string",
thisCache,
isNode = elem.nodeType,
// DOM 要素はキャッシュに保存する必要があり、JS オブジェクトは直接保存されますelem
cache = isNode ? jQuery .cache : elem,
// elem の jQuery.expando にすでに値がある場合は、
id = isNode ? elem[jQuery.expando] を再利用します。 && jQuery.expando;
// データが未定義で、現在の呼び出しがデータをクエリすることであるが、オブジェクトにデータがないことを示します。を返し、直接 
if((!id || (pvt && id && !cache[id][internalKey])) && getByName && data === unknown) {
return; >if(!id) {
if(isNode) {
// uuid シードを使用して一意の ID を段階的に割り当てます。これは DOM 要素にのみ必要です。グローバル キャッシュに保存する必要があるため、
elem[jQuery.expando] = id = jQuery.uuid;
} else {
id = jQuery.expando;
}
// 元の値をクリアします
if(!cache[id]) {
cache[id] = {};
if(!isNode) {
cache[id].toJSON = jQuery.noop;
}
}
// extend を使用してキャッシュを拡張し、データを保存するための属性を追加します
if(typeof name === "object" || typeof name === " function") {
if(pvt) {
cache[id][internalKey] = jQuery.expand(cache[id][internalKey], name);
} else {
cache[id] ] = jQuery .extend(cache[id], name);
}
}
thisCache = cahce[id]
// キーの競合を回避します
if(pvt) {
if( !thisCache[internalKey]) {
thisCache[internalKey] = {};
}
thisCache = thisCache[internalKey];
if(データ !== 未定義) {
thisCache[jQuery.camelCase(name)] = データ;
}
return getByName ? thisCache[jQuery.camelCase(name)] : thisCache;
removeData: function( elem , name, pvt ) { // フロント部分は data に似ています // ... // 一部のブラウザーは Element の削除操作をサポートしていません。jQuery.support でこのブラウザー機能を確認してください。 // 削除が失敗した場合は、まず null に設定します。 if ( jQuery.support.deleteExpando || キャッシュ != window ) { キャッシュを削除 [ id ]; } else { キャッシュ [ id ] = null; }
 ;CODE>var innerCache =cache[ id ][internalKey ]; 
// データがまだある場合は、それをクリアして再度設定し、パフォーマンスを向上させます。
if ( innerCache ) {
cache[ id ] = {} ;
cache[ id ][ InternalKey ] = externalCache;
// データがなくなったらすべて削除します
} else if ( isNode ) {
// 削除がサポートされている場合、削除します。
// IEではremoveAttributeを使っているので一度試してみてください。再度失敗した場合は、null に設定することしかできません。
if ( jQuery.support.deleteExpando ) {
delete elem[ jQuery.expando ];
} else if ( elem.removeAttribute ) {
elem.removeAttribute( jQuery.expando );
}
}
}

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート