jQuery.extend({
cache: {},
// 慎重に使用してください
uuid: 0,
// コピーごとに一意ですページ上の jQuery の
// rinlinejQuery に一致するように数字以外が削除されました
expando: "jQuery" ( jQuery.fn.jquery Math.random() ).replace( /D/g, "" ),
....
data: function( elem, name, data, pvt /* 内部使用のみ */ ) {
// データを追加できるかどうか、追加できない場合は直接返します
if ( !jQuery.acceptData( elem ) ) {
return;
}
var privateCache, thisCache, ret,
//jQuery.expando これは、This という固有の文字列です。 jquery オブジェクトは生成時に生成されます。
internalKey = jQuery.expando,
getByName = typeof name === "string",
// DOM 要素と JS オブジェクトは別々に処理する必要があります。 、IE6 ~ 7 は DOM オブジェクトと JS オブジェクト間でオブジェクト参照属性をガベージ コレクションできないため
isNode = elem.nodeType,
// DOM 要素の場合は、グローバル jQuery.cache を使用します
// JS オブジェクトの場合は、オブジェクトに直接アタッチします。
cache = isNode ? jQuery.cache : elem,
// キャッシュがすでに存在する場合のみ、JS オブジェクトの ID を定義できます。 🎜 >// キャッシュのない DOM ノードと同じパスにショートカットするコード
id = isNode ? elem[internalKey ] : elem[internalKey ] && innerKey,
isEvents = name === "events" ;
// データなしでオブジェクトのデータを取得しようとする場合は、これ以上不必要な作業を行わないようにしてください
// オブジェクトにデータがない場合は、直接戻ります
if ( (!id | | !cache[id] || (!isEvents && !pvt && !cache[id].data) && getByName && data === 未定義 ) {
return;
// id If存在しないので、
if ( !id ) {
// データがグローバル キャッシュに保存されるため、DOM ノードのみが各要素に新しい一意の ID を必要とします
//
if ( isNode ) {
// DOM 要素の場合は、要素に一意の ID を生成し、 jQuery.expando
// を属性値として使用し、その ID を elem 要素に保存します。後で jQuery.expando ID に基づいて検索されます。
elem[ innerKey ] = id = jQuery.uuid;
} else {
//JS オブジェクトはオブジェクトに直接アタッチされているのに、なぜ ID が必要なのでしょうか?
// 他の属性との競合を避けてください。
id = innerKey;
}
}
//// キーに値が含まれているかどうかにアクセスしようとすると、jQuery.cache[id] 値が存在しない場合、
// jQuery.cache[id] 値を空のオブジェクトに初期化します {}
if ( !cache[ id ] ) {
cache[ id ] = {};
if ( ! isNode ) {
cache[ id ].toJSON = jQuery.noop;
}
}
// キーと値のペアの代わりにオブジェクトを jQuery.data に渡すことができます。 ; これは
// 既存のキャッシュに浅くコピーされます
// データはオブジェクトと関数を受け取るため、浅いコピー
if ( typeof name === "object" || typeof name === "function " ) {
if ( pvt ) {
cache[ id ] = jQuery.extend(cache[ id ], name );
} else {
cache[ id ].data = jQuery .extend (cache[ id ].data, name );
}
}
/ すべてのデータを格納するマッピング オブジェクト
privateCache = thisCache = queue[ id ];
// jQuery data() は、内部データとユーザー定義の
// データ間のキーの衝突を避けるために、オブジェクトの内部データ
// キャッシュ内の別のオブジェクトに保存されます。 / jQuery 内部データは独立したオブジェクトに存在します (thisCache.data==thisCache[internalKey])
//内部データとユーザー定義データの競合を避けるためにオン
if ( !pvt ) {
// プライベートに保存 データ オブジェクトが存在しない場合は、データ オブジェクトを作成します。 {}
if ( !thisCache.data ) {
thisCache.data = {};
}
// thisCache を置き換えますプライベート データ オブジェクトを使用する
thisCache = thisCache.data;
}
// データが未定義でない場合、データ パラメーターが渡され、データが name 属性に格納されることを意味します
if ( data !== unknown ) {
// jQuery.camelCase(name) の機能は、オブジェクト/関数が渡された場合、変換は実行されません。
// 渡されるのは名前のみです。 in は文字列です。最終的に保存されるのはキーと値のペアです。
thisCache[ jQuery.camelCase( name ) ] = data;
}
// これ以降、次のコードがデータを処理します。 (elem, name) データが空の場合、戻り値のデータを検索します。
if ( isEvents && !thisCache[ name ] ) {
return privateCache.events;
}
// name が文字列の場合、データを返します
/ /そうでない場合は、ストレージ オブジェクト全体を返します。
if ( getByName ) {
// まず、現状のプロパティ データを検索してみます。
ret = thisCache[ name ]; / null|未定義のプロパティ データをテストします
if ( ret == null ) {
// CamelCased プロパティを検索してみます
ret = thisCache[ jQuery.camelCase( name ) ]; >}
} else {
ret = thisCache;
return
},
....
});
写真をご覧ください。
jQuery.data(element,[key],[value]) ソース コードを見ると、各要素にはデータを保存するための独自の {key:value} オブジェクトがあることがわかります。そのため、新しく作成されたオブジェクトは同じキーを持っています。 新しいオブジェクトは別の {key:value} オブジェクトに保存されるため、元の既存のオブジェクト キーに対応する値は上書きされません。
次に、それぞれ(callback)を使用するdata([key],[value])のソースコードを解析する必要があります。解析する前に、それぞれの使い方とソースコードを見てみましょう。 (折り返し電話)。
JS コード: