Tidak dapat memperbarui nilai atribut data

91

Meskipun ada beberapa contoh tentang ini di web, tampaknya ini tidak berfungsi dengan benar. Saya tidak tahu masalahnya.

Saya memiliki html sederhana ini

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

Setiap kali saya mengklik link "ubah nilai data", saya ingin memperbarui nilai data dari data-num. Misalnya saya membutuhkannya menjadi 1,2,3,4, ... (ditambah 1 setiap kali saya mengklik tautan)

apa yang saya miliki adalah

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

Nilainya berubah satu kali dari 0 menjadi 1 setiap kali. Saya tidak bisa membuatnya bertambah. Ada saran apa yang saya lakukan salah?

dev
sumber
5
data- hanya merupakan atribut pada pemuatan halaman. Data dimuat ke dom dan dimanipulasi di sana menggunakan .data(). Atribut tidak diperbarui dan tidak boleh digunakan untuk menyimpan atau mengambil data, hanya untuk set data awal.
Nigel Angel
1
@Nigel Salah. Tujuan atribut data adalah untuk menyediakan sarana bagi pengguna untuk menyimpan (dan memodifikasi) data arbitrer yang tidak memiliki tempat lain yang valid untuk dituju. Dan contoh ini akan menjadi mata uang asing ketika titik desimal adalah koma. Untuk kalkulasi numerik dengan ini, Anda harus menyimpan nilai yang sesuai dengan titik desimal aktual di suatu tempat. Jika ini adalah harga total dan perlu diperbarui berdasarkan perubahan, sekali lagi nilai data ini harus diubah dan oleh karena itu Anda harus dapat memperbaruinya. Untuk ini, Anda akan menggunakan .attr ()
jezzipin

Jawaban:

64

JAWABAN DI BAWAH INI ADALAH YANG BAIK

Anda tidak menggunakan metode data dengan benar. Kode yang benar untuk memperbarui data adalah:

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

Jadi contoh Anda adalah:

var num = $('#foo').data("num") + 1;       
console.log(num)       
$('#foo').data('num', num); 
console.log(num)
Lucas Willems
sumber
97
Ini salah, ini adalah metode yang salah untuk memperbarui atribut
adeneo
2
Ya, saya setuju dengan Anda @adeneo tetapi dia tidak menggunakan metode data dengan benar. Mengapa menggunakan atribut semacam ini jika Anda ingin memperbaruinya dengan metode attr?
Lucas Willems
@dev saya mengedit jawaban saya dan menambahkan seluruh kode yang harus Anda gunakan.
Lucas Willems
7
Ini menarik. Saya dapat melihat bahwa nilainya berubah di konsol. Tapi ketika saya melihat html menggunakan Chrome itu 0 (awal). Saya kira tidak apa-apa jika nanti saya dapat mengambil nilai terakhir (misalnya 5)
dev
6
Seperti yang dikatakan @dev, saya mencoba dan melihat itu berubah di jQuery tetapi tidak memengaruhi html di chrome dan safari. Jadi saya memutuskan untuk menggunakan attr () daripada data ().
QMaster
118

Gunakan itu sebagai gantinya, jika Anda ingin mengubah atribut data-num elemen node, bukan objek data :

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);
});

PS: tetapi Anda harus menggunakan objek data () di hampir semua kasus, tetapi tidak semua ...

A. Wolff
sumber
7
Data dimuat ke dom dan dimanipulasi di sana menggunakan .data (). Atribut tidak diperbarui dan tidak boleh digunakan untuk menyimpan atau mengambil data, hanya untuk set data awal. Meskipun ini adalah salah satu cara untuk mengubah atribut ( .prop()lebih disukai), ini bukanlah cara yang benar untuk menggunakan data.
Nigel Angel
4
.prop()akan mengakses atau mengubah nilai properti atau atribut apa pun di DOM tetapi tidak HTML. .attr()akan mengakses dan menulis ulang HTML yang membuatnya lebih lambat dari .prop(). Anda tidak boleh menggunakan .attr()alih-alih .data(), bukan hanya karena lebih lambat, tetapi karena itu bukan cara kerjanya. jsfiddle.net/eXA76/2
Nigel Angel
1
Saya pikir jawaban ini harus dihapus karena memberikan saran yang buruk dalam menggunakan data ().
Nigel Angel
2
Ya, dokumen jQuery tentang bagaimana seharusnya digunakan! api.jquery.com/data data disimpan dalam variabel global saat dokumen dimuat. Mereferensikannya melalui atribut TIDAK AKAN BERFUNGSI jika pengembang, plugin, atau skrip lain memperbarui data dengan benar menggunakan .data(). Dengan mengabaikan metode yang benar dan menggunakan atribut yang Anda tuju secara sengaja menyebabkan masalah.
Nigel Angel
4
@NigelAngel Meskipun saya menghargai pendapat Anda tentang hal ini, data tidak selalu merupakan pilihan terbaik untuk digunakan. Bagaimana jika Anda perlu memperbarui nilai atribut data dan menampilkannya di dom serta benar-benar mengubah nilai dasar yang kemudian digunakan oleh CSS atau bahkan Javascript? Pendekatan terbaik biasanya menggunakan .data () jika Anda tidak memperbarui nilai dengan cara apa pun dari Javascript, tetapi jika ya, selalu gunakan .attr () untuk menyetel dan mengambil nilai.
jezzipin
30

Jika kita ingin mengambil atau memperbarui atribut ini menggunakan JavaScript asli yang sudah ada , maka kita dapat melakukannya dengan menggunakan metode getAttributedan setAttributeseperti yang ditunjukkan di bawah ini:

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>

Melalui jQuery

// 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'); 

Baca dokumentasi ini untuk vanilla js atau dokumentasi untuk jquery ini

Lalit Kumar Maurya
sumber
@Nigel Angel, Sudahkah Anda mengujinya di firefox? $ (this) .data ('fruit') tidak berfungsi di firefox.
Lalit Kumar Maurya
Terima kasih banyak atas saran terakhir "Anda harus mengaturnya seperti di bawah ini untuk memperbarui nilai. Kemudian Anda akan mendapatkan nilai yang diperbarui" rly perilaku aneh di jquery ..
jgr
12

Bagi saya sendiri, menggunakan Jquery lib 2.1.1 berikut ini TIDAK berfungsi seperti yang saya harapkan:

Tetapkan nilai atribut data elemen:

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

TAPI elemen itu sendiri tetap tanpa atribut:

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

Saya membutuhkan DOM diperbarui sehingga saya bisa melakukan $ ('. My-class [data-num = "myValue"]') // panjang saat ini adalah 0

Jadi saya harus melakukannya

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

Untuk mengupdate DOM:

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

Apakah atribut ada atau tidak $ .attr akan menimpa.

Brian Ogden
sumber
1
Saya memiliki masalah yang sama dengan jquery 2.1.1!
dahak
8

Punya masalah serupa dan pada akhirnya saya harus mengatur keduanya

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

dan

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

Dan setelah ini

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

Semoga ini membantu.

Krist0K
sumber
6

Pada dasarnya ada dua cara untuk mengatur / mengupdate nilai atribut data, tergantung kebutuhan Anda. Perbedaannya hanya, dimana datanya disimpan,

Jika Anda menggunakannya, .data()itu akan disimpan dalam variabel lokal yang dipanggil data_user, dan tidak terlihat pada pemeriksaan elemen, Jika Anda menggunakannya .attr()akan terlihat secara publik.

Penjelasan lebih jelas tentang komentar ini

Andang Rian Dimas
sumber
2

Jawaban ini untuk mereka yang hanya ingin mengubah nilai atribut data

Saran tidak akan mengubah nilai atribut data Jquery Anda dengan benar seperti yang telah dinyatakan @adeneo. Untuk beberapa alasan, saya tidak melihat dia (atau orang lain) memposting metode yang benar bagi mereka yang ingin memperbarui data-attr mereka. Jawaban yang diposting oleh @Lucas Willems mungkin merupakan jawaban untuk masalah yang dimiliki Brian Tompsett - 汤 莱恩, tetapi bukan jawaban atas pertanyaan yang mungkin membawa pengguna lain ke sini.

Jawaban cepat sehubungan dengan pernyataan pertanyaan asli

-Untuk memperbarui data-attr

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

Kesalahan mudah * - harus ada "data-" di awal atribut yang ingin Anda ubah nilainya.

MattOlivos
sumber
2

Memiliki masalah serupa, saya mengusulkan solusi ini meskipun tidak didukung di IE 10 dan di bawahnya.

Diberikan

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

Standar Javascript mendefinisikan properti yang disebut dataset untuk memperbarui data-example-update.

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

Catatan: gunakan notasi huruf besar-kecil untuk mengakses atribut data yang benar.

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

Giovanni Romio
sumber
1

Saya memiliki masalah yang sama dengan tag data html yang tidak diperbarui ketika saya menggunakan jquery Tetapi mengubah kode yang melakukan pekerjaan sebenarnya dari jquery ke javascript bekerja.

Coba gunakan ini ketika tombol diklik: (Perhatikan bahwa kode utama adalah fungsi Javascripts setAttribute () .)

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);

});
Luka
sumber