Якщо ви передаєте дані до DOM-елемента з сервера, вам слід встановити дані на елементі:
<a id="foo" data-foo="bar" href="#">foo!</a>
Потім можна отримати доступ до даних, використовуючи .data()
jQuery:
console.log( $('#foo').data('foo') );
//outputs "bar"
Однак, коли ви зберігаєте дані на вузлі DOM у jQuery з використанням даних, змінні зберігаються на об'єкті вузла . Це для розміщення складних об'єктів та посилань, оскільки зберігання даних про елемент вузла, оскільки атрибут може містити лише рядкові значення.
Продовжуючи мій приклад зверху:
$('#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
Крім того, умова іменування для атрибутів даних має трохи прихованого "gotcha":
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
Це був надуманий приклад. Для зберігання кольорових значень я використовував числові шістнадцяткові позначення (тобто 0xABC123), але варто відзначити, що hex був розібраний неправильно у версіях jQuery до 1.7.2 і більше не аналізується на 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