Verileri sunucudan bir DOM öğesine iletiyorsanız, öğe üzerindeki verileri ayarlamanız gerekir:
<a id="foo" data-foo="bar" href="#">foo!</a>
Verilere daha sonra .data()
jQuery'de erişilebilir :
console.log( $('#foo').data('foo') );
//outputs "bar"
Ancak verileri kullanarak jQuery'de bir DOM düğümünde depoladığınızda, değişkenler düğüm nesnesinde depolanır . Bu, karmaşık nesnelerin ve referansların, düğüm öğesinde bir öznitelik olarak depolanmasının yalnızca dize değerlerini içereceğinden uyum sağlamaktır.
Yukarıdaki örneğimi devam ettiriyorum:
$('#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
Ayrıca, veri özellikleri için adlandırma kuralında gizli bir "gotcha" vardır:
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
Tireli anahtar yine de çalışır:
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"
Ancak, döndürülen nesnede .data()
tireli anahtar ayarlanmaz:
$('#bar').data().fooBarBaz; //works
$('#bar').data()['fooBarBaz']; //works
$('#bar').data()['foo-bar-baz']; //does not work
Bu nedenle javascriptte tireli anahtardan kaçınmanızı öneririm.
HTML için tireli formu kullanmaya devam edin. HTML özellikleri ASCII küçük harfli otomatik almak gerekiyordu , bu yüzden <div data-foobar></div>
, <DIV DATA-FOOBAR></DIV>
ve <dIv DaTa-FoObAr></DiV>
vardır sözde özdeş olarak kabul edilecek, ancak en iyi uyumluluk için küçük harf formu tercih edilmelidir.
.data()
Değeri tanınmış model eşleşirse yöntem, aynı zamanda bazı temel otomatik döküm gerçekleştirecektir:
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']}`
Bu otomatik döküm özelliği, widget'ları ve eklentileri örneklemek için çok uygundur:
$('.widget').each(function () {
$(this).widget($(this).data());
//-or-
$(this).widget($(this).data('widget'));
});
Dize olarak orijinal değere kesinlikle sahip olmanız gerekiyorsa, şunları kullanmanız gerekir .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
Bu tartışmalı bir örnekti. Renk değerlerini saklamak için sayısal onaltılı gösterim (yani 0xABC123) kullandım, ancak hex'in 1.7.2'den önceki jQuery sürümlerinde yanlış ayrıştırıldığını ve artık Number
jQuery 1.8 rc 1'den itibaren ayrıştırılmadığını belirtmek gerekir .
jQuery 1.8 rc 1 otomatik döküm davranışını değiştirdi . Önce, bir geçerli bir temsili oldu herhangi bir biçimde Number
dönüştürülürdü Number
. Şimdi, sayısal değerler yalnızca gösterimleri aynı kalırsa otomatik olarak yayınlanır. Bu en iyi şekilde bir örnekle gösterilmiştir.
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"
Sayısal değerlere erişmek için alternatif sayısal sözdizimleri kullanmayı planlıyorsanız, değeri Number
tekli bir +
işleç gibi bir ilke verdiğinizden emin olun .
JS (devam):
+$('#foo').data('hex'); // 1000