Bir veri özelliğinin var olup olmadığını kontrol etmenin bir yolu var mı?


190

Aşağıdaki çalıştırmak için bir yolu var mı:

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(', '));

Yalnızca #dataTable kimliğine sahip öğede veri zamanlayıcısı adı verilen bir özellik varsa?


Dikkat edilmesi gereken bir uyarı, bazen bir data-öznitelikte saklanan bir şey olmayacağı, ancak jQuery'de saklanan veriler olacağıdır.
Alex W

Yanıtlar:


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

Bu sadece getiri NOT trueveri özellik boş dize veya "Falsey" değeri, ör değilse 0veya false.

Veri özelliğinin var olup olmadığını kontrol etmek istiyorsanız, boş da olsa bunu yapın:

if (typeof $("#dataTable").data('timer') !== 'undefined') {
  ...
}

35
Sizin için bir başka seçenek: if ($("#dataTable[data-timer]").length) { ... }.
VisioN

101
Dikkatli ol! Bu yalnızca veri zamanlayıcı bir değere sahipse doğru olarak değerlendirilir. Varsa, ancak boşsa yanlış döndürür.
Kong

15
Kong haklıdır, eğer boş bir değer varsa kodunuz çalışmaz. Bunun yerine bunu kullanın: if (typeof $ ("# dataTable"). Attr ('data-timer')! == "undefined") {...}
PierrickM

22
Size koşullu için gerçek bir boolean verir Henüz başka versiyonu: if ( $("#dataTable").is("[data-timer]") ) { ... }. Başka bir jQuery nesnesindeki tabloya zaten bir başvurunuz varsa da daha kullanışlıdır.
Noyo

10
Değer varsa ve 0'a eşitse false döndürür. Bu ilginçtir.
Gherman

112
if (typeof $("#dataTable").data('timer') !== 'undefined')
{
    // your code here
}

@VisioN bir fail-güvende ve kombinasyonunu PierrickM üzerinde un yorumunu bu cevap: if (typeof $('#dataTable').data('timer') !== 'undefined') ....
WynandB

3
@Wynand. Sizinkini ve VisioN'un yorumunu yansıtacak şekilde güncellendi.
Paul Fleming

1
@flem Ayrıca typeofcheck
Brendan Bullen

1
@flem, @VisioN, veri özniteliğinin olmadığı durumlarda yaklaşımlarınız başarısız olur, ancak veriler hala .data () yöntemiyle ayarlanmıştır, örn $('#dataTable').data('timer', Date.now()). OP, gerçek veri özelliğinin orada olup olmadığını kontrol etmek istiyor gibi görünüyor. @ niiru'nun çözümü (veya bu çözüme bir yorumda sunduğunuz çözüm) bu durumda daha iyidir.
Noyo

1
@VisioN Benim için undefinedbu, tutarlı bir şekilde kontrol etmekle ilgili . Neden Biliyoruz typeofkontrol etmek için kullanılan undefinedbazı durumlarda, ama buna denetleniyor görmek kafa karıştırıcı bulacağını ile typeof tek bir yerde ve olmadan başka. Ayrıca, kullanmak çok daha karmaşık bir kod typeofekliyor gibi değil . Daha açık olabilir, belki de en fazla gereksiz olabilir, ancak çok fazla karmaşık olmayabilir. Ama ne demek istediğini anlıyorum, ama bunu kullanmamak aşırı basitleştirici olacaktır. ;]
WynandB

38

Yukarıdakilerden farklı bir cevap vermek amacıyla; şöyle kontrol edebilirsiniz Object.hasOwnProperty(...):

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

alternatif olarak, üzerinde yinelemek istediğiniz birden fazla veri öğeniz varsa, .data()nesneyi değişkenleştirebilir ve bunun üzerinde yineleyebilirsiniz:

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

Bu çözümün buradakinden daha iyi olduğunu söylememek, ama en azından başka bir yaklaşım ...


9
Bu ilginç, ancak özellik varsa, data-foo-baro zaman çek olması gerekir .data().hasOwnProperty("fooBar"), not edilmelidir.data().hasOwnProperty("foo-bar")
dgmstuart

Javascript doğrulayıcı ile bu durumda ilginç. Typeof tanımsız döndü, ama bu işe yaradı!
Richard Housham

12

Veya bazı vanilya JS ile birleştirin

if ($("#dataTable").get(0).hasAttribute("data-timer")) {
  ...
}

Bunu beğendim. Ancak, data()yerine jQuery kullanarak veri oluşturmak attr(), bu özniteliği bulamaz :(
Sam

10

JQuery'nin hasData yöntemini kullanabilirsiniz.

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

JQuery.hasData (element) 'in birincil avantajı, şu anda mevcut değilse, bir veri nesnesi oluşturmaması ve öğeyle ilişkilendirmemesidir. Buna karşılık, jQuery.data (element) her zaman bir veri nesnesini arayana döndürerek daha önce veri nesnesi yoksa bir nesne oluşturur.

Bu, yalnızca öğenizdeki veri nesnelerinin (veya olayların) varlığını kontrol eder, özellikle bir "zamanlayıcı" nesnesi olup olmadığını doğrulayamaz.


10

Boş değerler ile eksik değerler arasında ayrım yapmak istiyorsanız, jQuery'yi kullanarak bunu kontrol edebilirsiniz.

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

Yani asıl sorudan bunu yapardın.

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

7

Bunun için bir öğeyi sorgulamak için son derece basit bir jQuery-eklentisi oluşturabilirsiniz:

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

Sonra sadece kullanabilirsiniz $("#dataTable").hasData('timer')

Sorunlar:

  • falseSadece değer yoksa döner (is undefined); o ayarlı eğer false/ nullo hasData()dönüş hala olacaktrue .
  • $.hasData()Yalnızca öğedeki herhangi bir verinin ayarlanıp ayarlanmadığını kontrol eden yerleşikten farklıdır .

3

Bunun dinamik olarak ayarlanmış veri öğeleriyle daha iyi çalıştığını gördüm:

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

3

Buradaki tüm cevaplar jQuery kütüphanesini kullanır.

Ancak vanilya javascript çok basittir.

Bir ile eleman yalnızca bir komut dosyası çalıştırmak istiyorsanız idarasında #dataTable da bir sahiptir data-timerniteliğini, daha sonra adımlar aşağıdaki gibi şunlardır:

// Locate the element

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

// Run conditional code

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

  [... CODE HERE...]

}

2

Bence en kolay çözüm, belirli veri özniteliğine sahip tüm öğeleri seçmektir:

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(', '));

İşte nasıl çalıştığının ekran görüntüsü.

jquery seçicinin konsol günlüğü


1

Yanlış cevap - sondaki EDIT'e bakın

Alex'in cevabı üzerine inşa edeyim.

Bir veri nesnesinin mevcut olmaması durumunda oluşturulmasını önlemek için, daha iyi yaparım:

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

Sonra, $thishiçbir veri nesnesi oluşturulmamışsa, $.hasDatageri döner falseve yürütülmez $this.data(key).

EDIT: işlev $.hasData(element)yalnızca veriler kullanılarak ayarlandıysa çalışır $.data(element, key, value), değil element.data(key, value). Bu nedenle cevabım doğru değil.


1

Çalışmak için basit bir boole ihtiyacım vardı. Mevcut değil ve yanlış değil tanımsız olduğundan, !!boolean dönüştürmek için kullanın :

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

Alternatif bir çözüm filtre kullanmak olacaktır:

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

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(', '));
}

Eğer .data('timer')tanımlanmamış bir alırsınız TypeError: $ (...) verileri (...) tanımlanmamış. Denetlerken data.length. Bu büyük olasılıkla OP'nin sorusunun temelidir, yani kişinin data.lengthbaşka bir yerde güvenli bir şekilde kontrol edebilmesini sağlamaktır . Ayrıca, tanımlanmış bir özellik olarak dataiçerebileceği veya içermeyebileceği bir dize, bir dizi veya nesne olup olmadığını kesin olarak söyleyemezsiniz length.
WynandB

Evet cevabımın gözden geçirilmesi gerekiyor. 2012 yılında yazılmıştır .. Ama cevap zaten verildiği için yeniden yazmak işe yaramaz olurdu.
Luceos

0

İle css özellik seçimine göre kontrol edebilirsiniz.

if ($('#dataTable').is('[data-timer]')) {
   // data-timer attribute exists
}

3
Veri değerleri her zaman DOM özellikleri olarak saklanmaz. JQuery ile veri değerlerini $ .data kullanarak değiştirdiğinizde, bunu bir element özelliği olarak ayarlar.
qwerty

0

Ve ne hakkında:

if ($('#dataTable[data-timer]').length > 0) {
    // logic here
}
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.