Czy istnieje sposób, aby sprawdzić, czy istnieje atrybut danych?

190

Czy jest jakiś sposób na uruchomienie następujących czynności:

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

Tylko jeśli istnieje atrybut o nazwie data-timer na elemencie o identyfikatorze #dataTable?

Angela
źródło
Jednym z ostrzeżeń, o których należy pamiętać, jest to, że czasami w data-atrybucie nie będzie niczego, ale dane będą przechowywane w jQuery i odwrotnie.
Alex W

Odpowiedzi:

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

UWAGA zwraca to tylko truewtedy, gdy atrybut danych nie jest pustym łańcuchem lub wartością „falsey”, np . 0Lub false.

Jeśli chcesz sprawdzić, czy istnieje atrybut danych, nawet jeśli jest pusty, wykonaj następujące czynności:

if (typeof $("#dataTable").data('timer') !== 'undefined') {
  ...
}
niiru
źródło
35
Inną opcją dla Ciebie: if ($("#dataTable[data-timer]").length) { ... }.
VisioN
101
Bądź ostrożny! Sprawdza się to tylko wtedy, gdy licznik danych ma wartość. Jeśli jest obecny, ale pusty, zwróci wartość false.
Kong
15
Kong ma rację, jeśli jest pusta wartość, twój kod nie działa. Zamiast tego użyj tego: if (typeof $ ("# dataTable"). Attr ('data-timer')! == "undefined") {...}
PierrickM
22
Jeszcze inna wersja, która daje rzeczywistą wartość logiczną dla Twojego warunkowe: if ( $("#dataTable").is("[data-timer]") ) { ... }. Jest to również bardziej przydatne, jeśli masz już odwołanie do tabeli w innym obiekcie jQuery.
Noyo,
10
Zwróci false, jeśli wartość istnieje i jest równa 0. To dziwne.
Gherman,
112
if (typeof $("#dataTable").data('timer') !== 'undefined')
{
    // your code here
}
Paul Fleming
źródło
@VisioN awaryjne połączenie Państwa i PierrickM „s komentarz na tej odpowiedzi: if (typeof $('#dataTable').data('timer') !== 'undefined') ....
WynandB,
3
@Wynand. Zaktualizowano w celu odzwierciedlenia komentarza Twojego i VisioN.
Paul Fleming,
1
@flem Musisz również dodać typeofczek
Brendan Bullen
1
@flem, @VisioN, twoje podejście kończy się niepowodzeniem w przypadku, gdy nie ma atrybutu danych, ale dane zostały ustawione za pomocą metody .data (), np $('#dataTable').data('timer', Date.now()). Wygląda na to, że OP chce sprawdzić, czy istnieje rzeczywisty atrybut danych. Rozwiązanie @ niiru (lub to, które oferujesz w komentarzu do tego rozwiązania) jest lepsze w tym przypadku.
Noyo,
1
@VisioN Dla mnie chodzi o undefinedspójne sprawdzanie . Wiemy, dlaczego typeofjest używany w celu sprawdzenia undefined, w niektórych przypadkach, ale znajdę to mylące, aby zobaczyć, że nie są sprawdzane ze typeof w jednym miejscu i nie w innym. Poza tym nie jest tak, że używanie typeofdodaje znacznie bardziej skomplikowanego kodu. Może to być bardziej wyraźne, co najwyżej zbędne, ale prawie nie nadmiernie skomplikowane. Rozumiem jednak twój punkt widzenia, ale powiedziałbym, że nieużywanie go byłoby nadmiernym uproszczeniem. ;]
WynandB
38

W celu dostarczenia innej odpowiedzi niż powyższe; możesz to sprawdzić w Object.hasOwnProperty(...)następujący sposób:

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

alternatywnie, jeśli masz wiele elementów danych, które chcesz iterować, możesz zmieniać .data() obiekt i iterować go w następujący sposób:

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

Nie mówię, że to rozwiązanie jest lepsze niż którekolwiek z pozostałych tutaj, ale przynajmniej jest to inne podejście ...

sadmicrowave
źródło
9
Jest to interesujące, ale należy zauważyć, że jeśli masz atrybut, data-foo-barto musisz sprawdzić .data().hasOwnProperty("fooBar"), nie.data().hasOwnProperty("foo-bar")
dgmstuart
Interesujące w tym przypadku jest walidator javascript. Typof zwrócił niezdefiniowany, ale zadziałało!
Richard Housham,
12

Lub połącz z waniliowym JS

if ($("#dataTable").get(0).hasAttribute("data-timer")) {
  ...
}
Max
źródło
Ten mi się podoba. Jednak dane są tworzone przy użyciu jQuery za pomocą data()zamiast attr(), nie znajdzie atrybutu :(
Sam
10

Możesz użyć metody hasData jQuery.

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

Podstawową zaletą jQuery.hasData (element) jest to, że nie tworzy on obiektu danych i nie kojarzy go z elementem, jeśli żaden z nich obecnie nie istnieje. Natomiast jQuery.data (element) zawsze zwraca obiekt danych do obiektu wywołującego, tworząc go, jeśli wcześniej nie istniał żaden obiekt danych.

Spowoduje to jedynie sprawdzenie istnienia jakichkolwiek obiektów danych (lub zdarzeń) na twoim elemencie, nie będzie w stanie potwierdzić, czy konkretnie ma on obiekt „timera”.

BZink
źródło
10

Jeśli chcesz rozróżnić puste wartości od brakujących wartości, możesz użyć jQuery do sprawdzenia w ten sposób.

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

Więc z pierwotnego pytania zrobiłbyś to.

if("timer" in $("#dataTable").data()) {
  // code
}
Ryan
źródło
7

Możesz utworzyć niezwykle prostą wtyczkę jQuery, aby wysłać zapytanie do elementu w tym celu:

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

Następnie możesz po prostu użyć $("#dataTable").hasData('timer')

Gotchas:

  • Zwróci falsetylko wtedy, gdy wartość nie istnieje (jest undefined); jeśli jest ustawiony na false/ null, hasData()nadal będzie wracał true.
  • Różni się od wbudowanego, $.hasData()który sprawdza tylko, czy ustawione są jakieś dane elementu.
Alex
źródło
3

Przekonałem się, że działa to lepiej w przypadku dynamicznie ustawianych elementów danych:

if ($("#myelement").data('myfield')) {
  ...
}
JerSchneid
źródło
3

Wszystkie odpowiedzi tutaj wykorzystują bibliotekę jQuery.

Ale javascript waniliowy jest bardzo prosty.

Jeśli chcesz uruchomić skrypt tylko wtedy, gdy element ze związkiem idz #dataTable również ma data-timeratrybut, a następnie kroki są następujące:

// Locate the element

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

// Run conditional code

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

  [... CODE HERE...]

}
Rounin
źródło
2

Moim zdaniem jest to najłatwiejsze rozwiązanie, aby wybrać cały element, który ma określony atrybut danych:

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

Oto zrzut ekranu, jak to działa.

dziennik konsoli selektora jquery

Animesh Singh
źródło
1

Zła odpowiedź - patrz EDYCJA na końcu

Pozwól, że oprę się na odpowiedzi Alexa.

Aby zapobiec tworzeniu obiektu danych, jeśli nie istnieje, lepiej zrobić:

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

Następnie, $thisgdy nie utworzono żadnego obiektu danych, $.hasDatazwraca falsei nie zostanie wykonane $this.data(key).

EDYCJA: funkcja $.hasData(element)działa tylko wtedy, gdy dane zostały ustawione przy użyciu $.data(element, key, value), a nie element.data(key, value). Z tego powodu moja odpowiedź jest nieprawidłowa.

nestorrente
źródło
1

Potrzebowałem prostej boolean do pracy. Ponieważ jest niezdefiniowany jako nieobecny i nie fałszywy, używam !!do konwersji na boolean:

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

Alternatywnym rozwiązaniem byłoby użycie filtra:

if( $("#dataTable").filter('[data-timer]').length!==0) { /* ....... */ }
Martijn
źródło
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(', '));
}
Luceos
źródło
Jeśli nie .data('timer')jest zdefiniowany, otrzymasz TypeError: $ (...). Data (...) jest niezdefiniowana podczas sprawdzania data.length. Jest to najprawdopodobniej podstawa pytania PO, tj. Upewnienie się, że można bezpiecznie sprawdzić data.lengthgdzie indziej. Poza tym niekoniecznie będziesz w stanie stwierdzić z całą pewnością, czy datajest to ciąg, tablica czy obiekt, którego te ostatnie mogą, ale nie muszą, zawierać lengthjako zdefiniowaną właściwość.
WynandB,
Tak, moja odpowiedź wymaga korekty. Napisane w 2012 r. Ale przepisanie go byłoby bezużyteczne, ponieważ odpowiedź jest już udzielona.
Luceos,
0

Możesz to sprawdzić, wybierając atrybut css za pomocą

if ($('#dataTable').is('[data-timer]')) {
   // data-timer attribute exists
}
kulminacja
źródło
3
Wartości danych nie zawsze są przechowywane jako atrybuty DOM. Gdy modyfikujesz wartości danych za pomocą jQuery za pomocą $ .data, ustawia to jako właściwość elementu.
qwerty
0

A co z:

if ($('#dataTable[data-timer]').length > 0) {
    // logic here
}
dani24
źródło