Gibt es eine Möglichkeit, zu überprüfen, ob ein Datenattribut vorhanden ist?

190

Gibt es eine Möglichkeit, wie ich Folgendes ausführen kann:

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

Nur wenn das Element ein Attribut namens data-timer mit der ID #dataTable enthält?

Angela
quelle
Eine Einschränkung, die Sie beachten sollten, ist, dass manchmal nichts in einem data-Attribut gespeichert ist , sondern Daten in jQuery und umgekehrt.
Alex W

Antworten:

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

HINWEIS: Dies wird nur zurückgegeben, truewenn das Datenattribut keine leere Zeichenfolge oder ein "Falsey" -Wert ist, z . B. 0oder false.

Wenn Sie überprüfen möchten, ob das Datenattribut vorhanden ist, auch wenn es leer ist, gehen Sie folgendermaßen vor:

if (typeof $("#dataTable").data('timer') !== 'undefined') {
  ...
}
Niiru
quelle
35
Eine weitere Option für Sie : if ($("#dataTable[data-timer]").length) { ... }.
VisioN
101
Achtung! Dies wird nur dann als wahr ausgewertet, wenn der Daten-Timer einen Wert hat. Wenn es vorhanden, aber leer ist, wird false zurückgegeben.
Kong
15
Kong ist richtig, wenn es einen leeren Wert gibt, funktioniert Ihr Code nicht. Verwenden Sie stattdessen Folgendes: if (typeof $ ("# dataTable"). Attr ('data-timer')! == "undefined") {...}
PierrickM
22
Noch eine andere Version, die Ihnen einen tatsächlichen Booleschen Wert für Ihre Bedingung gibt : if ( $("#dataTable").is("[data-timer]") ) { ... }. Dies ist auch nützlicher, wenn Sie bereits einen Verweis auf die Tabelle in einem anderen jQuery-Objekt haben.
Noyo
10
Es wird false zurückgegeben, wenn der Wert vorhanden ist und gleich 0 ist. Dies ist eigenartig.
Gherman
111
if (typeof $("#dataTable").data('timer') !== 'undefined')
{
    // your code here
}
Paul Fleming
quelle
@VisioN Eine ausfallsichere Kombination aus Ihrem und PierrickMs Kommentar zu dieser Antwort : if (typeof $('#dataTable').data('timer') !== 'undefined') ....
WynandB
3
@ Wynand. Aktualisiert, um Ihren und den Kommentar von VisioN widerzuspiegeln.
Paul Fleming
1
@flem Sie müssen auch in den typeofScheck hinzufügen
Brendan Bullen
1
@flem, @VisioN, Ihre Ansätze schlagen fehl, wenn kein Datenattribut vorhanden ist, die Daten jedoch weiterhin mit der Methode .data () festgelegt wurden, z $('#dataTable').data('timer', Date.now()). Es scheint, dass das OP überprüfen möchte, ob das tatsächliche Datenattribut vorhanden ist. Die Lösung von @ niiru (oder die, die Sie in einem Kommentar zu dieser Lösung anbieten) ist in diesem Fall besser.
Noyo
1
@VisioN Für mich geht es darum, auf undefinedkonsistente Weise zu suchen . Wir wissen , warum typeofverwendet wird , um zu prüfen undefinedin einigen Fällen, aber ich würde , um es zu sehen verwirrend geprüft werden mit typeof an einem Ort und ohne in einem anderen. Außerdem ist es nicht wie mit typeofeinem fügt viel mehr kompliziert Code. Es kann expliziter sein, vielleicht höchstens überflüssig, aber kaum überkompliziert. Ich verstehe Ihren Standpunkt zwar, aber ich würde sagen, dass es zu einfach wäre, ihn nicht zu verwenden. ;]
WynandB
37

Im Interesse einer anderen Antwort als oben; Sie könnten es so überprüfen Object.hasOwnProperty(...):

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

Wenn Sie mehrere Datenelemente haben, über die Sie iterieren möchten, können Sie das .data()Objekt alternativ variieren und wie folgt durchlaufen :

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

Nicht zu sagen, dass diese Lösung besser ist als die anderen hier, aber zumindest ist es ein anderer Ansatz ...

sadmicrowave
quelle
9
Dies ist interessant, aber es sollte beachtet werden, dass, wenn Sie das Attribut haben, data-foo-barIhre Prüfung .data().hasOwnProperty("fooBar")nicht.data().hasOwnProperty("foo-bar")
dgmstuart sein muss
Interessant in diesem Fall mit dem Javascript Validator. Der Typ wurde undefiniert zurückgegeben, aber das hat funktioniert!
Richard Housham
12

Oder kombinieren Sie mit etwas Vanille JS

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

Sie können die hasData-Methode von jQuery verwenden.

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

Der Hauptvorteil von jQuery.hasData (Element) besteht darin, dass kein Datenobjekt erstellt und dem Element zugeordnet wird, wenn derzeit keines vorhanden ist. Im Gegensatz dazu gibt jQuery.data (Element) immer ein Datenobjekt an den Aufrufer zurück und erstellt eines, wenn zuvor kein Datenobjekt vorhanden war.

Dies überprüft nur das Vorhandensein von Datenobjekten (oder Ereignissen) in Ihrem Element. Es kann nicht bestätigt werden, ob es speziell ein "Timer" -Objekt enthält.

BZink
quelle
10

Wenn Sie zwischen leeren und fehlenden Werten unterscheiden möchten, können Sie dies mit jQuery überprüfen.

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

Von der ursprünglichen Frage würden Sie dies also tun.

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

Sie können ein extrem einfaches jQuery-Plugin erstellen, um ein Element dafür abzufragen:

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

Dann können Sie einfach verwenden $("#dataTable").hasData('timer')

Fallstricke:

  • Wird falsenur zurückgegeben, wenn der Wert nicht existiert (ist undefined); Wenn es auf false/ gesetzt ist, wird nulles hasData()immer noch zurückkehrentrue .
  • Es unterscheidet sich von dem eingebauten in $.hasData()dem nur überprüft , ob alle Daten auf dem Element gesetzt.
Alex
quelle
3

Ich habe festgestellt, dass dies mit dynamisch gesetzten Datenelementen besser funktioniert:

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

Alle Antworten hier verwenden die jQuery-Bibliothek.

Aber das Vanille-Javascript ist sehr einfach.

Wenn Sie ein Skript nur ausführen möchten, wenn das Element mit einem idvon #dataTable auch ein data-timerAttribut hat, lauten die Schritte wie folgt:

// Locate the element

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

// Run conditional code

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

  [... CODE HERE...]

}
Rounin
quelle
2

Dies ist meiner Meinung nach die einfachste Lösung, um alle Elemente auszuwählen, die bestimmte Datenattribute haben:

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

Hier ist der Screenshot, wie es funktioniert.

Konsolenprotokoll des JQuery-Selektors

Animesh Singh
quelle
1

Falsche Antwort - siehe BEARBEITEN am Ende

Lassen Sie mich auf Alex 'Antwort aufbauen.

Um die Erstellung eines Datenobjekts zu verhindern, wenn es nicht vorhanden ist, sollte ich Folgendes tun:

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

Wenn dann $thiskein Datenobjekt erstellt wurde, wird $.hasDatazurückgegeben falseund es wird nicht ausgeführt $this.data(key).

BEARBEITEN: Funktion $.hasData(element)funktioniert nur, wenn die Daten mit eingestellt wurden $.data(element, key, value), nicht element.data(key, value). Aus diesem Grund ist meine Antwort nicht korrekt.

nestorrente
quelle
1

Ich brauchte einen einfachen Booleschen Wert, um damit zu arbeiten. Da es nicht definiert ist, nicht vorhanden und nicht falsch zu sein, verwende ich das !!, um es in einen Booleschen Wert umzuwandeln:

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

Eine alternative Lösung wäre die Verwendung von Filter:

if( $("#dataTable").filter('[data-timer]').length!==0) { /* ....... */ }
Martijn
quelle
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
quelle
Wenn .data('timer')undefiniert ist, erhalten Sie einen TypeError: $ (...). Data (...) ist beim Überprüfen undefiniertdata.length . Dies ist höchstwahrscheinlich die Grundlage der Frage des OP, dh sicherzustellen, dass man sicher data.lengthanderswo prüfen kann . Außerdem könnten Sie nicht unbedingt sicher sagen, ob dataes sich um eine Zeichenfolge, ein Array oder ein Objekt handelt, dessen letztere lengthEigenschaft als definierte Eigenschaft enthalten sein kann oder nicht .
WynandB
Ja, meine Antwort muss überarbeitet werden. Geschrieben im Jahr 2012. Aber das Umschreiben wäre nutzlos, da die Antwort bereits gegeben ist.
Luceos
0

Sie können durch CSS-Attributauswahl mit überprüfen

if ($('#dataTable').is('[data-timer]')) {
   // data-timer attribute exists
}
Gipfel
quelle
3
Datenwerte werden nicht immer als DOM-Attribute gespeichert. Wenn Sie Datenwerte mit jQuery mithilfe von $ .data ändern, wird sie als Elementeigenschaft festgelegt.
QWERTY
0

Und was ist mit:

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