看jQuery.data(element/[key]">
ホームページ > ウェブフロントエンド > jsチュートリアル > jQuery オブジェクト データ キャッシュの概要 キャッシュの原理と jQuery.data メソッドの違い_jquery

jQuery オブジェクト データ キャッシュの概要 キャッシュの原理と jQuery.data メソッドの違い_jquery

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
リリース: 2016-05-16 17:38:07
オリジナル
1316 人が閲覧しました

jQuery.data(..) を使用してデータ キャッシュを実装する方法に関するオンライン チュートリアルは多数ありますが、ユーザーがよく使用するのは data([key],[value]) と jQuery.data(element,[key] の 2 つです) ,[value]. ]) 両者の違いを明確に説明している記事がほとんどないので、実際に使ってみて勉強して皆さんに共有してみました。

$("").data([key],[value]) と jQuery.data(element,[key],[value]) の違い
両方の関数が使用されます要素は通常データ キャッシュと呼ばれるもので、両方とも jQuery オブジェクトを返します。その違いは実際に知る必要はありませんが、実際に使用したときに驚きました。まず例を見て、次にソースコードに基づいて分析してみましょう。

Js コード:

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

test2

test3
test

aaaa


$(document ).ready(function(){
$("#test").click(function(){
alert("JQUERY");
var e=$("div") ;// 2 つの jquery オブジェクトが定義されています
var w=$("div"); //e は w と等しくありません。
//最初に data([key],[value]) を使用します。 e).data("a","aaaa");// e と w にそれぞれ同じキーを使用してデータを保存します。
$(w).data("a","wwww");// を参照してください。前のものが上書きされる場合は、別のオブジェクトに保存されます。
alert($(e).data("a"));// 答えはわかりましたか?
alert(e===w)//false
alert($(w).data("a"));//これも wwww;
// .data (element,[key],[value]) でデータを保存します。
$.data(e,"b","cccc");//同じデータを e と w にそれぞれ保存します。
$.data(w,"b","dddd");//別のオブジェクトに保存されているにもかかわらず、前のデータが上書きされるかどうかを確認します。
alert($.data(e,"b") ); // 答えは推測できるはずです。 cccc
alert($.data(w,"b"));// この出力は dddd
}); 🎜>< /script>


上の例を見て、data([key],[value]) と jQuery.data(element,[key],[value] を見つけましたか? ])全く同じではありませんよね?それらの間には何か関係があるのでしょうか? data([key],[value]) が前のキーの同じ値を上書きするのはなぜですか?

そして、jQuery.data(element,[key],[value]) は、異なるオブジェクトにバインドされている限り、上書きを引き起こしません。そうですか?ソースコードを調べてみましょう。
まず jQuery.data(element,[key],[value]) のソース コードを見てください。
Js コード:




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

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 これは、この jquery オブジェクトの生成時に生成される固有の文字列です 🎜>internalKey = jQuery.expando,
getByName = typeof name === "string",
// IE6-7 では DOM オブジェクトと JS オブジェクト間でオブジェクトをガベージ コレクションできないため、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"
// データを取得せずに何かを実行しようとするときに、さらに不必要な作業を行わないようにします。 object
// オブジェクトにはデータがありません。直接
if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data) ) && getByName && data === unknown ) {
return;
}
// ID が存在しない場合は、ID を 1 つ生成します
if ( !id ) {
// DOM ノードのみが必要ですデータがグローバル キャッシュに保存されるため、各要素に新しい一意の ID
//
if ( isNode ) {
// DOM 要素の場合は、要素に一意の ID を生成し、次を使用しますjQuery.expando
//後で jQuery.expando に基づいて ID を見つけられるように、属性値を elem 要素の 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 = cache[ id ]
// jQuery data() が格納されます。オブジェクトの内部データ内の別のオブジェクト
// 内部データとユーザー定義の
// データ間のキーの衝突を避けるためのキャッシュ。
// jQuery の内部データは別のオブジェクト (thisCache. data= =thisCache[internalKey ])
//内部データとユーザー定義データの競合を避けるためにオン
if ( !pvt ) {
// プライベートデータを格納するオブジェクトが存在しない1 つ作成します。 {}
if ( !thisCache.data ) {
thisCache.data = {};
}
// thisCache をプライベート データ オブジェクトに置き換えます
thisCache = thisCache.data ;
}
// データが未定義でない場合は、データ パラメータが渡され、データが name 属性に格納されることを意味します
if ( data !== unknown ) {
// jQuery.camelCase( name ) の関数は、渡された場合はオブジェクト/関数であり、変換は行われません。
// 渡された名前のみが文字列として変換されます。最終的に保存されるのはキーと値のペアです。
thisCache[ jQuery.camelCase( name ) ] = data;
}
// これ以降、次のコードがデータを処理します。 name) のデータが空の場合は、戻り値のデータを調べます。
if ( isEvents && !thisCache[ name ] ) {
return privateCache.events;
}
// name が文字列の場合、データを返します
// そうでない場合、ストレージ全体を返しますobject
if ( getByName ) {
// まず現状のプロパティ データを検索してみます
ret = thisCache[ name ];
// null|未定義のプロパティ データをテストします
if ( ret == null ) {
// CamelCased プロパティを検索してみます
ret = thisCache[ jQuery.camelCase( name ) ];
}
} else {
ret = thisCache ; 🎜>}
リターン
}、
....
});
画像をご覧ください
jQuery オブジェクト データ キャッシュの概要 キャッシュの原理と jQuery.data メソッドの違い_jquery
jQuery.data(element,[key],[value]) ソース コードを見ると、各要素が独自の {key:value を持つことがわかります。新しいオブジェクトは別の {key:value} オブジェクトに保存されるため、データが保存されるため、新しく作成されたオブジェクトが同じキーを持っていたとしても、元の既存のオブジェクトのキーに対応する値は上書きされません。

次に、それぞれ(callback)を使用するdata([key],[value])のソースコードを解析する必要があります。解析する前に、それぞれの使い方とソースコードを見てみましょう。 (折り返し電話)。

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

test2

test3
test

aaaa


$(document ).ready(function(){
$("#test").click(function(){
alert("JQUERY");
var i=0;
$ ("# abc3").each(function() {
alert( i);//
が 1 つしかないため、1 のみを出力します
}); >alert("- ---");
var j=0;
$("div").each(function() {
alert( j);//出力 1, 2,
}); が 3 つあるため、


jQuery.fn = jQuery.prototype = {
each: function( callback, args ) {
return jQuery.each( this, callback, args );
}
}
返される内容は次のとおりです。グローバル each メソッドと、独自の jQuery オブジェクトがパラメーターとしてそれに与えられます。グローバル each メソッドの具体的な実装は次のとおりです:
// args は内部メンバーへの呼び出しとして使用されます
each: function ( object, callback, args ) {
var name, i = 0, length = object.length; // object が jQuery オブジェクトの場合、length は空ではありません
if ( args ) {
if ( length = == 未定義 ) {
for ( name in object )
if ( callback.apply( object[ name ], args ) === false )
break
} else
for ( ; i < length; )
if ( callback.apply( object[ i ], args ) === false )
break;
// 以下は <🎜 を呼び出すクライアント プログラムです。 >} else {
if ( length === unknown ) {
for ( object 内の name )
if ( callback.call( object[ name ], name, object[ name ] ) === false )
break;
} else
// i はインデックス値を表し、value は DOM 要素を表します
for ( var value = object[0];
i < length && callback. call( value, i , value ) !== false;
value = object[ i] ){}
}
return object;


focus on for ( var value = object[0]; i < length && callback.call( value, i, value ) !== false; value = object[ i] ){} このコードでは、 object[0] が取得されます。 jQuery オブジェクト 最初の DOM 要素については、for ループを通じて、
が jQuery オブジェクト全体の対応する各 DOM 要素を走査し、callback.call(value,i,value) を通じてコールバックのこのオブジェクトをポイントします。 value オブジェクトを指定し、2 つのパラメータを渡します。i はインデックス値を表し、value は DOM 要素を表します。コールバックは function(index, elem) { } と同様のメソッドです。 $("").each(function(index, elem){ });
data([key],[value]) のソース コードを見てみましょう
Js コード:



コードをコピー


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

jQuery.fn.extend({
data: function( key, value) {
var パーツ, パーツ, 属性, 名前, l,
elem = this[0],
i = 0,
data = null;
// すべての値を取得します
if ( key === unknown ) {
....// Key なしの場合を処理しますここで説明する内容ではありません。
return data;
}
// 複数の値を設定します。
if ( typeof key === "object" ) {
return this. each(function() {
jQuery.data( this, key );
});
}
parts = key.split( ".", 2 ); ] = パーツ[1] "." パーツ[1] : "";
パーツ = パーツ[1] "!"; ( value === unknown ) {
. // ここでは、値がない場合の戻り値の取得について説明します。
parts[1] = value; 🎜>//$("div").data("a","aaa")) を使用する場合、以下のそれぞれを呼び出す前の this は、$("div")、
this.each によって返されるオブジェクトを参照します。 (function() { //ここでは、一致する各要素を関数を実行するコンテキストとして使用していることに注意してください。
var self = jQuery( this );
self.triggerHandler( "setData" part, Parts );
// ここで要素に保存されるデータは基本的に data(element, [key], [value]) に委譲されます。
//前の分析を参照してください。
//次の data(this, key, value) は、ページ内の
配列に対応する jQuery オブジェクト
//$("div") 内の対応する各 DOM 要素を走査することを指します。
jQuery.data( this, key, value );//このステートメントはループ内で複数回実行されます。つまり、データが保存されます< ;/スパン> 。
//ここが核心文です。ただし、上記でそれが each(functipn(){}) にあることを明確に見てください。
self.triggerHandler( "changeData" 部分, 部分 );
}, null, value, argument.length > 1,
},
//要素に保存されているデータを削除します。具体的な実装は次のとおりです。
removeData: function( key ) {
return this.each(function() {
jQuery.removeData( this, key );
}); }
});


data([key],[value]) のソース コードについてあまり詳しくない場合は、例を使って真似してみましょう。
Js コード:



コードをコピー


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

aaaa

<script> ).ready (function(){ $("#test").click(function(){ </div>alert("JQUERY"); <div class="codebody" id="code89542">var i=0; <br>$("# abc3") .each(function() { <br>alert( i);//<div id="abc3"> が 1 つしかないため、出力 1 のみ; <br>}); <br>alert( "---- "); <br>var j=1; <br>$("div").each(function() {//一致する各要素をコンテキストとしてこの関数を実行します<br>$.data (this, "a","wwww");//ここでは、$("div"), <br>//一致する各要素を個別にトラバースし、各オブジェクトのキー/値を保存します {} <br>alert(j );//<br>要素が 3 つあるため、それぞれ 1、2、3 を出力します。<br>alert($("#test").data("a")) ; //wwww に戻ります。<br>//この div ノードに値があるかどうかを確認しているのは明らかです。 >//値が必要です。上記のループは div の Dom ノードに保存されているためです。<br>alert($("#test")===$("div"));//false であることがわかります。新しく作成された 2 つのオブジェクトは同じではありません。 <br>alert($("div").data("a"));//Return wwww, <br>//ここでも同じことが当てはまります。 "="wwww" は div ノードに保存されています。キーの値は正しいです。<br>}); <br>}); <br></script>


ここでデータですjQuery の ([キー],[値]) はすでに理解しています。それでも理解できない場合は、もう一度読んで根気よく理解してください。実際、表面的には大きく異なります。しかし、本質的にはまだつながりがあります。原理を理解したので、安心して使用できます。 jQuery.data(element,[key],[value]) は、データをパラメータ要素ノードにバインドするだけです。 data([key],[value])
たとえば、$("div").data("a","aaaa") は、div ノードに一致する各要素にデータをバインドします。
補足ですが、この記事の解析にはjquery-1.7.2.jsのソースコードを使用しています。ダウンロードアドレス:
http://demo.jb51.net/jslib/jquery/jquery-1.7.2.min.js
関連ラベル:
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート