サーバーからDOM要素にデータを渡す場合は、要素にデータを設定する必要があります。
<a id="foo" data-foo="bar" href="#">foo!</a>
その後.data()
、jQuery を使用してデータにアクセスできます。
console.log( $('#foo').data('foo') );
//outputs "bar"
ただし、データを使用してjQueryのDOMノードにデータを格納する場合、変数はノードオブジェクトに格納されます。これは、複雑なオブジェクトと参照に対応するためです。ノード要素にデータを格納すると、属性は文字列値のみに対応するためです。
上から私の例を続ける:
$('#foo').data('foo', 'baz');
console.log( $('#foo').attr('data-foo') );
//outputs "bar" as the attribute was never changed
console.log( $('#foo').data('foo') );
//outputs "baz" as the value has been updated on the object
また、データ属性の命名規則には、少し隠れた「問題」があります。
HTML:
<a id="bar" data-foo-bar-baz="fizz-buzz" href="#">fizz buzz!</a>
JS:
console.log( $('#bar').data('fooBarBaz') );
//outputs "fizz-buzz" as hyphens are automatically camelCase'd
ハイフン付きのキーは引き続き機能します。
HTML:
<a id="bar" data-foo-bar-baz="fizz-buzz" href="#">fizz buzz!</a>
JS:
console.log( $('#bar').data('foo-bar-baz') );
//still outputs "fizz-buzz"
ただし、によって返されるオブジェクトに.data()
は、ハイフン付きのキーセットはありません。
$('#bar').data().fooBarBaz; //works
$('#bar').data()['fooBarBaz']; //works
$('#bar').data()['foo-bar-baz']; //does not work
このため、JavaScriptではハイフン付きのキーを使用しないことをお勧めします。
HTMLの場合は、ハイフン付きのフォームを使用し続けます。HTML属性は、ASCII小文字に自動的に取得することになっているので、<div data-foobar></div>
、<DIV DATA-FOOBAR></DIV>
、と<dIv DaTa-FoObAr></DiV>
されているはずの同一として扱われますが、最高の互換性のために小文字の形が好まれるべきです。
この.data()
メソッドは、値が認識されたパターンに一致する場合、基本的な自動キャストも実行します。
HTML:
<a id="foo"
href="#"
data-str="bar"
data-bool="true"
data-num="15"
data-json='{"fizz":["buzz"]}'>foo!</a>
JS:
$('#foo').data('str'); //`"bar"`
$('#foo').data('bool'); //`true`
$('#foo').data('num'); //`15`
$('#foo').data('json'); //`{fizz:['buzz']}`
この自動キャスト機能は、ウィジェットとプラグインのインスタンス化に非常に便利です。
$('.widget').each(function () {
$(this).widget($(this).data());
//-or-
$(this).widget($(this).data('widget'));
});
元の値を文字列として絶対に持つ必要がある場合は、次を使用する必要があります.attr()
。
HTML:
<a id="foo" href="#" data-color="ABC123"></a>
<a id="bar" href="#" data-color="654321"></a>
JS:
$('#foo').data('color').length; //6
$('#bar').data('color').length; //undefined, length isn't a property of numbers
$('#foo').attr('data-color').length; //6
$('#bar').attr('data-color').length; //6
これは人為的な例でした。色の値を保存するために、私は数値の16進表記(つまり0xABC123)を使用していましたが、16進数が1.7.2より前のjQueryバージョンで誤って解析さNumber
れ、jQuery 1.8 rc 1 以降では解析されなくなったことは注目に値します。
jQuery 1.8 rc 1は自動キャストの動作を変更しました。以前は、の有効な表現であるすべての形式Number
がにキャストされていましたNumber
。現在、数値である値は、それらの表現が同じままの場合にのみ自動キャストされます。これは例で最もよく示されています。
HTML:
<a id="foo"
href="#"
data-int="1000"
data-decimal="1000.00"
data-scientific="1e3"
data-hex="0x03e8">foo!</a>
JS:
// pre 1.8 post 1.8
$('#foo').data('int'); // 1000 1000
$('#foo').data('decimal'); // 1000 "1000.00"
$('#foo').data('scientific'); // 1000 "1e3"
$('#foo').data('hex'); // 1000 "0x03e8"
代替の数値構文を使用して数値にアクセスする場合は、必ずNumber
単項演算+
子などを使用して、値を最初にキャストしてください。
JS(続き):
+$('#foo').data('hex'); // 1000