Existe-t-il un moyen de vérifier si un attribut de données existe?

194

Existe-t-il un moyen d'exécuter ce qui suit:

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

Uniquement s'il existe un attribut appelé data-timer sur l'élément avec un identifiant #dataTable?

Angela
la source
Une mise en garde à prendre en compte est que parfois, il n'y aura rien de stocké dans un data-attribut, mais des données seront stockées dans jQuery et vice versa.
Alex W

Réponses:

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

REMARQUE ceci ne renvoie que truesi l'attribut de données n'est pas une chaîne vide ou une valeur "falsey", par exemple 0ou false.

Si vous souhaitez vérifier l'existence de l'attribut data, même s'il est vide, procédez comme suit:

if (typeof $("#dataTable").data('timer') !== 'undefined') {
  ...
}
niiru
la source
35
Une autre option pour vous: if ($("#dataTable[data-timer]").length) { ... }.
VisioN
101
Faites attention! Cela ne prend la valeur true que si le temporisateur de données a une valeur. S'il est présent, mais vide, il retournera faux.
Kong
15
Kong a raison, s'il y a une valeur vide, votre code ne fonctionne pas. Utilisez ceci à la place: if (typeof $ ("# dataTable"). Attr ('data-timer')! == "undefined") {...}
PierrickM
22
Une autre version qui vous donne un véritable booléen pour votre condition: if ( $("#dataTable").is("[data-timer]") ) { ... }. C'est également plus utile si vous avez déjà une référence à la table dans un autre objet jQuery.
Noyo
10
Il retournera false si la valeur existe et est égale à 0. C'est bizarre.
Gherman
113
if (typeof $("#dataTable").data('timer') !== 'undefined')
{
    // your code here
}
Paul Fleming
la source
Un @VisioN fail-safe combinaison de votre et PierrickM commentaire de sur cette réponse: if (typeof $('#dataTable').data('timer') !== 'undefined') ....
WynandB
3
@Wynand. Mis à jour pour refléter le vôtre et le commentaire de VisioN.
Paul Fleming
1
@flem Vous devez également ajouter le typeofchèque
Brendan Bullen
1
@flem, @VisioN, vos approches échouent dans le cas où il n'y a pas d'attribut de données, mais les données ont toujours été définies avec la méthode .data (), par exemple $('#dataTable').data('timer', Date.now()). Il semble que l'OP veuille vérifier que l'attribut de données réel est présent. La solution de @ niiru (ou celle que vous proposez dans un commentaire sur cette solution) est meilleure, dans ce cas.
Noyo
1
@VisioN Pour moi, il s'agit de vérifier de undefinedmanière cohérente. Nous savons pourquoi typeofest utilisé pour vérifier undefineddans certains cas, mais je trouverais source de confusion pour le voir en cours de vérification avec typeof en un seul endroit et sans dans un autre. En outre, ce n'est pas comme si utiliser typeofajoute du code beaucoup plus compliqué . Il peut être plus explicite, peut-être redondant tout au plus mais pas trop compliqué. Je comprends cependant votre point de vue, mais je dirais que ne pas l'utiliser serait une simplification excessive. ;]
WynandB
38

Dans l'intérêt de fournir une réponse différente de celles ci-dessus; vous pouvez le vérifier Object.hasOwnProperty(...)comme ceci:

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

Sinon, si vous avez plusieurs éléments de données que vous souhaitez parcourir, vous pouvez faire varier l' .data()objet et le parcourir comme ceci:

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

Ne pas dire que cette solution est meilleure que toutes les autres ici, mais au moins c'est une autre approche ...

triste
la source
9
C'est intéressant, mais il convient de noter que si vous avez l'attribut, data-foo-barvotre vérification doit être .data().hasOwnProperty("fooBar"), pas.data().hasOwnProperty("foo-bar")
dgmstuart
Intéressant dans ce cas avec le validateur javascript. Le typeof retourné indéfini, mais cela a fonctionné!
Richard Housham
12

Ou combiner avec un peu de vanille JS

if ($("#dataTable").get(0).hasAttribute("data-timer")) {
  ...
}
Max
la source
J'aime celui la. Cependant, vous créez les données en utilisant jQuery à la data()place de attr(), il ne trouvera pas l'attribut :(
Sam
11

Vous pouvez utiliser la méthode hasData de jQuery.

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

Le principal avantage de jQuery.hasData (élément) est qu'il ne crée pas et n'associe pas un objet de données à l'élément s'il n'en existe pas actuellement. En revanche, jQuery.data (élément) renvoie toujours un objet de données à l'appelant, en en créant un si aucun objet de données n'existait auparavant.

Cela vérifiera uniquement l'existence de tous les objets de données (ou événements) sur votre élément, il ne pourra pas confirmer s'il a spécifiquement un objet "timer".

BZink
la source
10

Si vous voulez faire la distinction entre les valeurs vides et les valeurs manquantes, vous pouvez utiliser jQuery pour vérifier comme ceci.

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

Donc, à partir de la question initiale, vous feriez cela.

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

Vous pouvez créer un plugin jQuery extrêmement simple pour interroger un élément à ce sujet:

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

Ensuite, vous pouvez simplement utiliser $("#dataTable").hasData('timer')

Gotchas:

  • Ne retournera falseque si la valeur n'existe pas (est undefined); s'il est défini sur false/, nullil hasData()reviendra toujours true.
  • Il est différent de celui intégré $.hasData()qui vérifie uniquement si des données sur l'élément sont définies.
Alex
la source
6

Toutes les réponses ici utilisent la bibliothèque jQuery.

Mais le javascript vanille est très simple.

Si vous voulez exécuter un script que si l'élément avec un idde #dataTable aussi a un data-timerattribut, les étapes sont les suivantes:

// Locate the element
const myElement = document.getElementById('dataTable');

// Run conditional code
if (myElement.dataset.hasOwnProperty('timer')) {

  [... CODE HERE...]

}
Rounin
la source
3

J'ai trouvé que cela fonctionne mieux avec des éléments de données définis dynamiquement:

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

C'est la solution la plus simple à mon avis est de sélectionner tous les éléments qui ont certains attributs de données:

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

Voici la capture d'écran de son fonctionnement.

journal de la console du sélecteur jquery

Animesh Singh
la source
1

Mauvaise réponse - voir EDIT à la fin

Permettez-moi de développer la réponse d'Alex.

Pour empêcher la création d'un objet de données s'il n'existe pas, je ferais mieux de faire:

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

Ensuite, où $thisaucun objet de données n'a été créé, $.hasDataretourne falseet il ne s'exécutera pas $this.data(key).

EDIT: la fonction $.hasData(element)ne fonctionne que si les données ont été définies en utilisant $.data(element, key, value), pas element.data(key, value). Pour cette raison, ma réponse n'est pas correcte.

nestorrente
la source
1

J'avais besoin d'un simple booléen pour travailler. Parce qu'il est indéfini ou non présent et non faux, j'utilise !!pour convertir en booléen:

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

Une solution alternative consisterait à utiliser le filtre:

if( $("#dataTable").filter('[data-timer]').length!==0) { /* ....... */ }
Martijn
la source
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
la source
Si .data('timer')n'est pas défini, vous obtiendrez une TypeError: $ (...). Data (...) n'est pas défini lors de la vérification data.length. C'est probablement la base de la question du PO, c'est-à-dire s'assurer que l'on peut vérifier en toute sécurité data.lengthailleurs. De plus, vous ne seriez pas nécessairement en mesure de dire avec certitude s'il datas'agit d'une chaîne, d'un tableau ou d'un objet, dont ce dernier peut ou non contenir en lengthtant que propriété définie.
WynandB
Oui, ma réponse doit être révisée. Écrit en 2012 .. Mais la réécrire serait inutile tant la réponse est déjà donnée.
Luceos
0

Vous pouvez vérifier par sélection d'attributs css avec

if ($('#dataTable').is('[data-timer]')) {
   // data-timer attribute exists
}
acmé
la source
3
Les valeurs de données ne sont pas toujours stockées en tant qu'attributs DOM. Lorsque vous modifiez les valeurs de données avec jQuery en utilisant $ .data, il le définit comme propriété d'élément.
qwerty
0

Et à propos de:

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