Jeśli przekazujesz dane do elementu DOM z serwera, powinieneś ustawić dane na elemencie:
<a id="foo" data-foo="bar" href="#">foo!</a>
Dostęp do danych można następnie uzyskać .data()
w jQuery:
console.log( $('#foo').data('foo') );
//outputs "bar"
Jednak podczas przechowywania danych w węźle DOM w jQuery przy użyciu danych zmienne są przechowywane w obiekcie węzła . Ma to na celu uwzględnienie złożonych obiektów i odniesień, ponieważ przechowywanie danych w elemencie węzła jako atrybutu uwzględni tylko wartości ciągu.
Kontynuując mój przykład z góry:
$('#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
Ponadto konwencja nazewnictwa atrybutów danych zawiera trochę ukrytego „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
Dzielony klucz będzie nadal działał:
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"
Jednak obiekt zwracany przez .data()
nie będzie miał ustawionego klucza dzielonego:
$('#bar').data().fooBarBaz; //works
$('#bar').data()['fooBarBaz']; //works
$('#bar').data()['foo-bar-baz']; //does not work
Z tego powodu sugeruję unikanie klucza dzielonego w javascript.
W przypadku HTML używaj dzielonego formularza. Atrybuty HTML mają dostać ASCII małe litery automatycznie , tak <div data-foobar></div>
, <DIV DATA-FOOBAR></DIV>
i <dIv DaTa-FoObAr></DiV>
są niby być traktowane jako identyczne, ale dla najlepszej zgodności powinny być preferowane dolna forma przypadek.
The .data()
Metoda będzie również wykonać kilka podstawowych funkcji automatycznego odlewania jeżeli wartość odpowiada uznanym wzór:
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']}`
Ta funkcja automatycznego rzutowania jest bardzo wygodna w przypadku tworzenia widgetów i wtyczek:
$('.widget').each(function () {
$(this).widget($(this).data());
//-or-
$(this).widget($(this).data('widget'));
});
Jeśli absolutnie musisz mieć oryginalną wartość jako ciąg, musisz użyć .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
To był wymyślony przykład. Do przechowywania wartości kolorów używałem numerycznej notacji szesnastkowej (tj. 0xABC123), ale warto zauważyć, że szesnastka została niepoprawnie przeanalizowana w wersjach jQuery przed 1.7.2 i nie jest już przetwarzana na Number
jQuery 1.8 rc 1.
jQuery 1.8 rc 1 zmieniło zachowanie automatycznego rzucania . Wcześniej każdy format, który był prawidłową reprezentacją pliku, Number
byłby rzutowany na Number
. Teraz wartości liczbowe są rzutowane automatycznie tylko wtedy, gdy ich reprezentacja pozostaje taka sama. Najlepiej ilustruje to przykład.
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"
Jeśli planujesz używać alternatywnych składni numerycznych w celu uzyskania dostępu do wartości liczbowych, pamiętaj, aby rzucić wartość na Number
pierwszą, na przykład za pomocą jednoargumentowego +
operatora.
JS (ciąg dalszy):
+$('#foo').data('hex'); // 1000