Veri özniteliği değeri güncellenemiyor


92

Bununla ilgili internette bazı örnekler olsa da doğru çalışmıyor gibi görünüyor. Sorunu çözemiyorum.

Bu basit html'ye sahibim

         <div id="foo" data-num="0"></ div>
         <a href="#" id="changeData">change data value</a>

"Veri değerini değiştir" bağlantısını her tıkladığımda data-num'un veri değerini güncellemek istiyorum. Örneğin 1,2,3,4, ... (artı her bağlantıya tıkladığımda 1)

sahip olduğum şey

            var num = $('#foo').data("num");
            console.log(num);
            num = num+1;               
            console.log(num);
            $('#foo').attr('data-num', num);   

Değer, her seferinde 0'dan 1'e bir kez değişir. Artımlı yapamam. Neyi yanlış yaptığıma dair herhangi bir öneriniz var mı?


5
data- yalnızca sayfa yüklemesinde bir özniteliktir. Veriler doma yüklenir ve kullanılarak burada işlenir .data(). Özellik güncellenmez ve verileri depolamak veya almak için kullanılmamalıdır, yalnızca başlangıçta verileri ayarlamak için kullanılmalıdır.
Nigel Angel

1
@NigelAngel Wrong. Veri özniteliğinin amacı, kullanıcıların gidecekleri başka bir geçerli yeri olmayan keyfi verileri depolayabilecekleri (ve değiştirebilecekleri) bir yol sağlamaktır. Ve bunun örneği, ondalık nokta virgül olduğunda yabancı para birimi için verilebilir. Bununla sayısal hesaplamalar yapmak için, bir yerde gerçek bir ondalık nokta ile uygun bir değer kaydetmeniz gerekir. Bu bir toplam fiyatsa ve değişikliklere göre güncellenmesi gerekiyorsa, yine bu veri değerinin değişmesi gerekir ve bu nedenle güncelleyebilmeniz gerekir. Bunun için
jezzipin

Yanıtlar:


65

AŞAĞIDAKİ CEVAP İYİDİR

Veri yöntemini doğru kullanmıyorsunuz . Verileri güncellemek için doğru kod:

$('#foo').data('num', num); 

Yani örneğiniz şöyle olacaktır:

var num = $('#foo').data("num") + 1;       
console.log(num)       
$('#foo').data('num', num); 
console.log(num)

97
Bu yanlış, bu bir özniteliği güncellemek için yanlış yöntem
adeneo

2
Evet, sana katılıyorum @adeneo ama o veri yöntemini doğru kullanmıyor. Attr yöntemi ile güncellemek istiyorsanız neden bu tür bir özniteliği kullanasınız?
Lucas Willems

@dev cevabımı düzenledim ve kullanmanız gereken kodun tamamını ekledim.
Lucas Willems

7
Bu ilginç. Konsolda değerin değiştiğini görebiliyorum. Ancak html'ye Chrome kullanarak baktığımda 0 (başlangıç). Sanırım daha sonra son değeri alabilirsem sorun değil (örneğin 5)
dev

6
@Dev'in dediği gibi, jQuery'de bunun değiştiğini ancak krom ve safaride html'yi etkilemediğini gördüm ve gördüm. Bu yüzden data () yerine attr () kullanmaya karar verdim.
QMaster

118

Bunun yerine, veri nesnesinin değil, düğüm öğesinin öznitelik veri-numarasını değiştirmek isterseniz bunu kullanın :

DEMO

$('#changeData').click(function (e) { 
    e.preventDefault();
    var num = +$('#foo').attr("data-num");
    console.log(num);
    num = num + 1;
    console.log(num);
    $('#foo').attr('data-num', num);
});

Not: ancak data () nesnesini hemen hemen her durumda kullanmalısınız, ancak hepsinde değil ...


7
Veriler doma yüklenir ve burada .data () kullanılarak işlenir. Özellik güncellenmez ve verileri depolamak veya almak için kullanılmamalıdır, yalnızca başlangıçta verileri ayarlamak için kullanılmalıdır. Bu, bir özniteliği değiştirmenin bir yolu olsa da ( .prop()tercih edilir), verileri kullanmanın doğru yolu değildir.
Nigel Angel

4
.prop()DOM'daki herhangi bir özelliğin veya özniteliğin değerine erişecek veya bunları değiştirecek, ancak HTML'de değil. .attr()HTML'ye erişir ve yeniden yazar, bu da onu daha yavaş yapar .prop(). Bunun .attr()yerine kullanmamalısınız .data(), sadece daha yavaş olduğu için değil, aynı zamanda çalışması gerektiği gibi olmadığı için. jsfiddle.net/eXA76/2
Nigel Angel

1
Sanırım bu cevabın silinmesi gerektiğini düşünüyorum çünkü data () kullanımı hakkında kötü tavsiyeler veriyor.
Nigel Angel

2
Evet, jQuery nasıl kullanılması gerektiğine dair belgeler! api.jquery.com/data verileri, belge yüklenirken genel bir değişkende saklanır. Başka bir geliştirici, eklenti veya komut dosyası kullanarak verileri doğru bir şekilde güncellerse, öznitelik aracılığıyla buna başvurmak ÇALIŞMAZ .data(). Doğru yöntemi görmezden gelerek ve özniteliği kullanarak bilerek sorunlara yol açarsınız.
Nigel Angel

4
@NigelAngel Bu konudaki fikrinizi takdir etsem de, veriler her zaman kullanılacak en iyi seçenek değildir. Bir veri özniteliğinin değerini güncellemeniz ve etki alanında görüntülemenizin yanı sıra daha sonra CSS veya hatta Javascript tarafından kullanılan temel değeri gerçekten değiştirmeniz gerekirse ne olur? En iyi yaklaşım, değeri herhangi bir şekilde Javascript'ten güncellemiyorsanız, ancak güncelliyorsanız, değeri hem ayarlamak hem de almak için her zaman .attr () kullanın.
jezzipin

30

Bu özellikleri mevcut, yerel JavaScript kullanarak almak veya güncellemek istersek, bunu aşağıda gösterilen getAttributeve setAttributeyöntemlerini kullanarak yapabiliriz :

JavaScript

<script>
// 'Getting' data-attributes using getAttribute
var plant = document.getElementById('strawberry-plant');
var fruitCount = plant.getAttribute('data-fruit'); // fruitCount = '12'

// 'Setting' data-attributes using setAttribute
plant.setAttribute('data-fruit','7'); // Pesky birds
</script>

JQuery aracılığıyla

// Fetching data
var fruitCount = $(this).data('fruit');

// Above does not work in firefox. So use below to get attribute value.
var fruitCount = $(this).attr('data-fruit');

// Assigning data
$(this).data('fruit','7');

// But when you get the value again, it will return old value. 
// You have to set it as below to update value. Then you will get updated value.
$(this).attr('data-fruit','7'); 

Vanilla js için bu belgeleri veya jquery için bu belgeleri okuyun


@Nigel Angel, firefox'ta test ettiniz mi? $ (this) .data ['meyve') firefox'ta çalışmaz.
Lalit Kumar Maurya

Son tavsiyeniz için çok teşekkür ederim "Değeri güncellemek için aşağıdaki gibi ayarlamalısınız. O zaman güncellenmiş değer alacaksınız"
jquery'de

12

Kendim için, Jquery lib 2.1.1'i kullanarak aşağıdakiler beklediğim gibi ÇALIŞMADI:

Öğe veri özelliği değerini ayarlayın:

$('.my-class').data('num', 'myValue');
console.log($('#myElem').data('num'));// as expected = 'myValue'

ANCAK öğenin kendisi öznitelik olmadan kalır:

<div class="my-class"></div>

Daha sonra $ ('. My-class [data-num = "myValue"]') // geçerli uzunluk 0 yapabilmek için DOM'un güncellenmesine ihtiyacım vardı

Bu yüzden yapmak zorundaydım

$('.my-class').attr('data-num', 'myValue');

DOM'un güncellenmesini sağlamak için:

<div class="my-class" data-num="myValue"></div>

Özniteliğin var olup olmadığı $ .attr üzerine yazılacaktır.


1
Jquery 2.1.1 ile aynı sorunu yaşıyorum!
phlegx

8

Benzer bir sorun vardı ve sonunda ikisini de ayarlamak zorunda kaldım

obj.attr('data-myvar','myval')

ve

obj.data('myvar','myval')

Ve bundan sonra

obj.data('myvar') == obj.attr('data-myvar')

Bu yardımcı olur umarım.


6

Temel olarak, ihtiyaçlarınıza bağlı olarak veri özniteliği değerini ayarlamanın / güncellemenin iki yolu vardır. Aradaki fark, verilerin kaydedildiği yer,

Eğer kullanırsanız , .data()adı verilen yerel değişkene kaydedilir data_userve eleman incelendiğinde görünmez, kullanırsanız .attr()herkes tarafından görülebilir.

Bu yorum hakkında çok daha net açıklama


2

Bu cevap, sadece bir veri özniteliğinin değerini değiştirmek isteyenler içindir.

@Adeneo'nun belirttiği gibi önerilen, Jquery data-attr'ınızın değerini doğru şekilde değiştirmeyecektir. Yine de bazı nedenlerden dolayı, onu (veya başkalarını) veri özniteliklerini güncellemek isteyenler için doğru yöntemi gönderdiğini görmüyorum. @Lucas Willems'in gönderdiği cevap Brian Tompsett'in - 汤 莱恩 sorununun cevabı olabilir, ancak diğer kullanıcıları buraya getirebilecek olan sorunun cevabı olmayabilir.

Orijinal sorgulama beyanıyla ilgili hızlı cevap

-Veri özniteliklerini güncellemek için

$('#ElementId').attr('data-attributeTitle',newAttributeValue);

Kolay hatalar * - değerini değiştirmek istediğiniz özelliğinizin başında "veri" olmalıdır.


2

Benzer bir sorunla karşılaştığımda, IE 10 ve altı sürümlerde desteklenmese de bu çözümü öneriyorum.

Verilen

<div id='example' data-example-update='1'></div>

Javascript standardı, veri-örnek-güncellemeyi güncellemek için veri kümesi adı verilen bir özelliği tanımlar.

document.getElementById('example').dataset.exampleUpdate = 2;

Not: Doğru veri özelliğine erişmek için deve harf durumu gösterimini kullanın.

Kaynak: https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes


1

Jquery kullanırken html veri etiketinin güncellenmemesiyle ilgili aynı sorunu yaşadım, ancak asıl işi yapan kodu jquery'den javascript'e değiştirmek işe yaradı.

Düğme tıklandığında bunu kullanmayı deneyin: (Ana kodun Javascripts setAttribute () işlevi olduğuna dikkat edin .)

function increment(q) {

    //increment current num by adding with 1
    q = q+1;

    //change data attribute using JS setAttribute function
    div.setAttribute('data-num',q);

    //refresh data-num value (get data-num value again using JS getAttribute function)
    num = parseInt(div.getAttribute('data-num'));

    //show values
    console.log("(After Increment) Current Num: "+num);

}

//get variables, set as global vars
var div = document.getElementById('foo');
var num = parseInt(div.getAttribute('data-num'));

//increment values using click
$("#changeData").on('click',function(){

    //pass current data-num as parameter
    increment(num);

});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.