Apakah ada cara saya dapat memeriksa apakah ada atribut data?

190

Apakah ada cara agar saya dapat menjalankan yang berikut ini:

var data = $("#dataTable").data('timer');
var diffs = [];

for(var i = 0; i + 1 < data.length; i++) {
    diffs[i] = data[i + 1] - data[i];
}

alert(diffs.join(', '));

Hanya jika ada atribut yang disebut data-timer pada elemen dengan id #dataTable?

Angela
sumber
Satu peringatan yang harus diperhatikan adalah bahwa kadang-kadang tidak akan ada apa pun yang disimpan dalam data-atribut tetapi akan ada data yang disimpan di jQuery dan sebaliknya.
Alex W

Jawaban:

296
if ($("#dataTable").data('timer')) {
  ...
}

CATATAN ini hanya kembali truejika atribut data bukan string kosong atau nilai "falsey" misalnya 0atau false.

Jika Anda ingin memeriksa keberadaan atribut data, bahkan jika kosong, lakukan ini:

if (typeof $("#dataTable").data('timer') !== 'undefined') {
  ...
}
niiru
sumber
35
Pilihan lain untuk Anda: if ($("#dataTable[data-timer]").length) { ... }.
VisioN
101
Hati-hati! Ini hanya bernilai true jika data-timer memiliki nilai. Jika ada, tetapi kosongkan akan kembali salah.
Kong
15
Kong benar, jika ada nilai kosong kode Anda tidak berfungsi. Gunakan ini sebagai gantinya: if (typeof $ ("# dataTable"). Attr ('data-timer')! == "undefined") {...}
PierrickM
22
Namun versi lain yang memberikan Anda sebuah boolean sebenarnya untuk bersyarat Anda: if ( $("#dataTable").is("[data-timer]") ) { ... }. Ini juga lebih berguna jika Anda sudah memiliki referensi ke tabel di objek jQuery lain.
Noyo
10
Ini akan mengembalikan false jika nilainya ada dan sama dengan 0. Ini unik.
Gherman
112
if (typeof $("#dataTable").data('timer') !== 'undefined')
{
    // your code here
}
Paul Fleming
sumber
@VisioN Sebuah gagal-aman kombinasi dan PierrickM komentar 's pada ini jawaban: if (typeof $('#dataTable').data('timer') !== 'undefined') ....
WynandB
3
@Wynand. Diperbarui untuk mencerminkan komentar Anda dan VisioN.
Paul Fleming
1
@ flem Anda juga perlu menambahkan typeofcek
Brendan Bullen
1
@ flem, @VisioN, pendekatan Anda gagal dalam kasus di mana tidak ada atribut data, tetapi data masih ditetapkan dengan metode .data (), misalnya $('#dataTable').data('timer', Date.now()). Tampaknya OP ingin memeriksa apakah ada atribut data aktual. Solusi @ niiru (atau yang Anda tawarkan di komentar untuk solusi itu) lebih baik, dalam hal ini.
Noyo
1
@Visio Bagi saya ini tentang memeriksa undefinedsecara konsisten. Kita tahu mengapa typeofdigunakan untuk memeriksa undefineddalam beberapa kasus, tapi aku merasa membingungkan untuk melihatnya sedang diperiksa dengan typeof di satu tempat dan tanpa di lain. Selain itu, tidak seperti menggunakan typeofmenambahkan kode yang jauh lebih rumit . Ini mungkin lebih eksplisit, mungkin berlebihan paling banyak tetapi tidak terlalu rumit. Saya mengerti maksud Anda, tetapi saya akan mengatakan bahwa tidak menggunakannya adalah penyederhanaan yang berlebihan. ;]
WynandB
38

Demi memberikan jawaban yang berbeda dari yang di atas; Anda bisa memeriksanyaObject.hasOwnProperty(...) seperti ini:

 if( $("#dataTable").data().hasOwnProperty("timer") ){
     // the data-time property exists, now do you business! .....
 }

alternatifnya, jika Anda memiliki beberapa elemen data yang ingin Anda iterate, Anda bisa mengubah-ubah .data()objek dan iterate di atasnya seperti ini:

 var objData = $("#dataTable").data();
 for ( data in objData ){
      if( data == 'timer' ){
            //...do the do
      }
 }

Tidak mengatakan solusi ini lebih baik daripada yang lain di sini, tapi setidaknya itu pendekatan lain ...

gelombang mikro
sumber
9
Ini menarik, tetapi perlu dicatat bahwa jika Anda memiliki atribut data-foo-barmaka cek Anda harus .data().hasOwnProperty("fooBar"), tidak.data().hasOwnProperty("foo-bar")
dgmstuart
Menarik dalam hal ini dengan validator javascript. Jenis kembali tidak terdefinisi, tetapi ini berhasil!
Richard Housham
12

Atau kombinasikan dengan beberapa vanilla JS

if ($("#dataTable").get(0).hasAttribute("data-timer")) {
  ...
}
Maks
sumber
Saya suka yang ini. Namun, Anda membuat data menggunakan jQuery data()alih-alih attr(), itu tidak akan menemukan atribut :(
Sam
10

Anda dapat menggunakan metode hasData jQuery.

http://api.jquery.com/jQuery.hasData/

Keuntungan utama dari jQuery.hasData (elemen) adalah tidak membuat dan mengaitkan objek data dengan elemen jika tidak ada saat ini. Sebaliknya, jQuery.data (elemen) selalu mengembalikan objek data ke pemanggil, membuatnya jika tidak ada objek data sebelumnya.

Ini hanya akan memeriksa keberadaan objek data (atau peristiwa) pada elemen Anda, itu tidak akan dapat mengkonfirmasi apakah ia secara khusus memiliki objek "timer".

BZink
sumber
10

Jika Anda ingin membedakan antara nilai kosong dan nilai yang hilang, Anda dapat menggunakan jQuery untuk memeriksa seperti ini.

<div id="element" data-foo="bar" data-empty=""></div>

<script>
"foo" in $('#element').data(); // true
"empty" in $('#element').data(); // true
"other" in $('#element').data(); // false
</script>

Jadi dari pertanyaan awal Anda akan melakukan ini.

if("timer" in $("#dataTable").data()) {
  // code
}
Ryan
sumber
7

Anda dapat membuat jQuery-plugin yang sangat sederhana untuk menanyakan elemen untuk ini:

$.fn.hasData = function(key) {
  return (typeof $(this).data(key) != 'undefined');
};

Maka Anda cukup menggunakan $("#dataTable").hasData('timer')

Gotchas:

  • Akan kembali falsehanya jika nilainya tidak ada undefined; jika itu diatur untuk false/ nullitu hasData()masih akan kembali true.
  • Ini berbeda dari built-in $.hasData()yang hanya memeriksa apakah ada data pada elemen yang ditetapkan.
Alex
sumber
3

Saya telah menemukan ini berfungsi lebih baik dengan secara dinamis mengatur elemen data:

if ($("#myelement").data('myfield')) {
  ...
}
JerSchneid
sumber
3

Semua jawaban di sini menggunakan perpustakaan jQuery.

Tapi javascript vanilla sangat mudah.

Jika Anda ingin menjalankan script hanya jika elemen dengan idof #dataTable juga memiliki data-timeratribut, maka langkah-langkah adalah sebagai berikut:

// Locate the element

const myElement = document.getElementById('dataTable');

// Run conditional code

if (myElement.dataset.hasOwnProperty('timer')) {

  [... CODE HERE...]

}
Rounin
sumber
2

Ini adalah solusi termudah menurut saya adalah memilih semua elemen yang memiliki atribut data tertentu:

var data = $("#dataTable[data-timer]");
var diffs = [];

for(var i = 0; i + 1 < data.length; i++) {
    diffs[i] = data[i + 1] - data[i];
}

alert(diffs.join(', '));

Ini adalah screenshot cara kerjanya.

log konsol pemilih jquery

Animesh Singh
sumber
1

Jawaban salah - lihat EDIT di bagian akhir

Biarkan saya membangun jawaban Alex.

Untuk mencegah pembuatan objek data jika tidak ada, sebaiknya saya lakukan:

$.fn.hasData = function(key) {
    var $this = $(this);
    return $.hasData($this) && typeof $this.data(key) !== 'undefined';
};

Kemudian, di mana $thistidak ada objek data yang dibuat, $.hasDatakembali falsedan tidak akan dijalankan $this.data(key).

EDIT: fungsi $.hasData(element)hanya berfungsi jika data diatur menggunakan $.data(element, key, value), bukan element.data(key, value). Karena itu, jawaban saya salah.

nestorrente
sumber
1

Saya membutuhkan boolean sederhana untuk bekerja dengannya. Karena tidak terdefinisi dari tidak ada, dan tidak salah, saya menggunakan !!untuk mengonversi ke boolean:

var hasTimer = !!$("#dataTable").data('timer');
if( hasTimer ){ /* ....... */ }

Solusi alternatif menggunakan filter:

if( $("#dataTable").filter('[data-timer]').length!==0) { /* ....... */ }
Martijn
sumber
0
var data = $("#dataTable").data('timer');
var diffs = [];

if( data.length > 0 ) {
for(var i = 0; i + 1 < data.length; i++) {
    diffs[i] = data[i + 1] - data[i];
}

alert(diffs.join(', '));
}
Luceo
sumber
Jika .data('timer')tidak terdefinisi, Anda akan mendapatkan TypeError: $ (...). Data (...) tidak terdefinisi saat memeriksa data.length. Ini kemungkinan besar merupakan dasar dari pertanyaan OP, yaitu memastikan bahwa seseorang dapat dengan aman memeriksa di data.lengthtempat lain. Selain itu, Anda tidak akan dapat mengatakan dengan pasti apakah datastring, array atau objek, yang mungkin berisi atau tidak berisi lengthsebagai properti yang ditentukan.
WynandB
Ya jawaban saya perlu revisi. Ditulis pada tahun 2012 .. Tapi menulis ulang itu akan sia-sia karena jawabannya sudah diberikan.
Luceos
0

Anda dapat memeriksa dengan pemilihan atribut css dengan

if ($('#dataTable').is('[data-timer]')) {
   // data-timer attribute exists
}
puncak
sumber
3
Nilai data tidak selalu disimpan sebagai atribut DOM. Saat Anda mengubah nilai data dengan jQuery menggunakan $ .data, ini menetapkannya sebagai properti elemen.
qwerty
0

Dan bagaimana dengan:

if ($('#dataTable[data-timer]').length > 0) {
    // logic here
}
dani24
sumber