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?
javascript
jquery
Angela
źródło
źródło
data-
atrybucie nie będzie niczego, ale dane będą przechowywane w jQuery i odwrotnie.Odpowiedzi:
UWAGA zwraca to tylko
true
wtedy, gdy atrybut danych nie jest pustym łańcuchem lub wartością „falsey”, np .0
Lubfalse
.Jeśli chcesz sprawdzić, czy istnieje atrybut danych, nawet jeśli jest pusty, wykonaj następujące czynności:
źródło
if ($("#dataTable[data-timer]").length) { ... }
.if ( $("#dataTable").is("[data-timer]") ) { ... }
. Jest to również bardziej przydatne, jeśli masz już odwołanie do tabeli w innym obiekcie jQuery.źródło
if (typeof $('#dataTable').data('timer') !== 'undefined') ...
.typeof
czek$('#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.undefined
spójne sprawdzanie . Wiemy, dlaczegotypeof
jest używany w celu sprawdzeniaundefined
, w niektórych przypadkach, ale znajdę to mylące, aby zobaczyć, że nie są sprawdzane zetypeof
w jednym miejscu i nie w innym. Poza tym nie jest tak, że używanietypeof
dodaje 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. ;]W celu dostarczenia innej odpowiedzi niż powyższe; możesz to sprawdzić w
Object.hasOwnProperty(...)
następujący sposób: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:Nie mówię, że to rozwiązanie jest lepsze niż którekolwiek z pozostałych tutaj, ale przynajmniej jest to inne podejście ...
źródło
data-foo-bar
to musisz sprawdzić.data().hasOwnProperty("fooBar")
, nie.data().hasOwnProperty("foo-bar")
Lub połącz z waniliowym JS
źródło
data()
zamiastattr()
, nie znajdzie atrybutu :(Możesz użyć metody hasData jQuery.
http://api.jquery.com/jQuery.hasData/
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”.
źródło
Jeśli chcesz rozróżnić puste wartości od brakujących wartości, możesz użyć jQuery do sprawdzenia w ten sposób.
Więc z pierwotnego pytania zrobiłbyś to.
źródło
Możesz utworzyć niezwykle prostą wtyczkę jQuery, aby wysłać zapytanie do elementu w tym celu:
Następnie możesz po prostu użyć
$("#dataTable").hasData('timer')
Gotchas:
false
tylko wtedy, gdy wartość nie istnieje (jestundefined
); jeśli jest ustawiony nafalse
/null
,hasData()
nadal będzie wracałtrue
.$.hasData()
który sprawdza tylko, czy ustawione są jakieś dane elementu.źródło
Przekonałem się, że działa to lepiej w przypadku dynamicznie ustawianych elementów danych:
źródło
Wszystkie odpowiedzi tutaj wykorzystują bibliotekę jQuery.
Ale javascript waniliowy jest bardzo prosty.
Jeśli chcesz uruchomić skrypt tylko wtedy, gdy element ze związkiem
id
z#dataTable
również madata-timer
atrybut, a następnie kroki są następujące:źródło
Moim zdaniem jest to najłatwiejsze rozwiązanie, aby wybrać cały element, który ma określony atrybut danych:
Oto zrzut ekranu, jak to działa.
źródło
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ć:
Następnie,
$this
gdy nie utworzono żadnego obiektu danych,$.hasData
zwracafalse
i 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 nieelement.data(key, value)
. Z tego powodu moja odpowiedź jest nieprawidłowa.źródło
Potrzebowałem prostej boolean do pracy. Ponieważ jest niezdefiniowany jako nieobecny i nie fałszywy, używam
!!
do konwersji na boolean:Alternatywnym rozwiązaniem byłoby użycie filtra:
źródło
źródło
.data('timer')
jest zdefiniowany, otrzymasz TypeError: $ (...). Data (...) jest niezdefiniowana podczas sprawdzaniadata.length
. Jest to najprawdopodobniej podstawa pytania PO, tj. Upewnienie się, że można bezpiecznie sprawdzićdata.length
gdzie indziej. Poza tym niekoniecznie będziesz w stanie stwierdzić z całą pewnością, czydata
jest to ciąg, tablica czy obiekt, którego te ostatnie mogą, ale nie muszą, zawieraćlength
jako zdefiniowaną właściwość.Możesz to sprawdzić, wybierając atrybut css za pomocą
źródło
A co z:
źródło