2011-10-17 4 views
24

ソースを調べているうちに、 'toggle'はjQuery._dataを使用して要素の状態を保存していると考えられました。私はjQuery.cacheのクロムのオブジェクトを調べ、要素のデータオブジェクトの下に、別のオブジェクトがあります。そのオブジェクトの下に、jQueryという単語の前に、私が一意に識別していると推測している数字が付いています。しかし、私は要素の状態に関するデータは見ませんでした。単に{olddisplay: 'block'}です。 jQuery._dataの目的に関する手がかりとそれがどのように機能するのか?jQuery.dataとjQuery._dataの違いは何ですか(アンダースコアデータ)?

私はソースを一日中見つめていました....ソースを表示するよう教えてください。私の目と脳はあなたに感謝します。

+2

多くの場合、あなたは'LL * private *やその他の特殊な意味として扱われることになっている変数や関数(またはオブジェクトメソッド/プロパティ)がスコープやアプリケーションでグループ化する '_'のようなプリレンドされた文字を持っているのを見てください。 jQueryでは、単にオブジェクト*に対してこれを扱うようにしています。つまり、**外部からアクセスしないでください。** –

答えて

46

jQueryはオブジェクトに保存するデータの 'pvt'フラグを設定するために_dataを使用します。 pvtは、オブジェクトからパブリックデータを要求すると、pvtデータが返されないように使用されます。これは、jQueryの内部で.data()メカニズムを使用して(どのようなトグルが行われているのか)、一般公開されている.data()を有効にしないようにするためです。

あなたはjQueryのソースにこの宣言を見ることができます:

// For internal use only. 
_data: function(elem, name, data) { 
    return jQuery.data(elem, name, data, true); 
}, 

だけjQuery.dataを呼び出し、真であると(プライバシある)第四パラメータを強制します。データを取り出すときに、pvtフラグがセットされていれば、若干異なる方法で検索されます。 .data()への公開インターフェイスはpvtフラグを公開しません。

あなたはjQuery.data()のこの部分で、ここで扱うpvtの例を参照することができます

// An object can be passed to jQuery.data instead of a key/value pair; this gets 
// shallow copied over onto the existing cache 
if (typeof name === "object" || typeof name === "function") { 
    if (pvt) { 
     cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name); 
    } else { 
     cache[ id ] = jQuery.extend(cache[ id ], name); 
    } 
} 

し、後でその同じ関数内に、このコメントはかなりわかりやすいです:

// Internal jQuery data is stored in a separate object inside the object's data 
// cache in order to avoid key collisions between internal data and user-defined 
// data 
if (pvt) { 
    if (!thisCache[ internalKey ]) { 
     thisCache[ internalKey ] = {}; 
    } 
    thisCache = thisCache[ internalKey ]; 
} 
+0

素晴らしい説明。あなたの答えをありがとう! – THEtheChad

関連する問題