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?
javascript
jquery
Angela
la source
la source
data-
attribut, mais des données seront stockées dans jQuery et vice versa.Réponses:
if ($("#dataTable").data('timer')) { ... }
REMARQUE ceci ne renvoie que
true
si l'attribut de données n'est pas une chaîne vide ou une valeur "falsey", par exemple0
oufalse
.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') { ... }
la source
if ($("#dataTable[data-timer]").length) { ... }
.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.if (typeof $("#dataTable").data('timer') !== 'undefined') { // your code here }
la source
if (typeof $('#dataTable').data('timer') !== 'undefined') ...
.typeof
chèque$('#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.undefined
manière cohérente. Nous savons pourquoitypeof
est utilisé pour vérifierundefined
dans certains cas, mais je trouverais source de confusion pour le voir en cours de vérification avectypeof
en un seul endroit et sans dans un autre. En outre, ce n'est pas comme si utilisertypeof
ajoute 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. ;]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 ...
la source
data-foo-bar
votre vérification doit être.data().hasOwnProperty("fooBar")
, pas.data().hasOwnProperty("foo-bar")
Ou combiner avec un peu de vanille JS
if ($("#dataTable").get(0).hasAttribute("data-timer")) { ... }
la source
data()
place deattr()
, il ne trouvera pas l'attribut :(Vous pouvez utiliser la méthode hasData de jQuery.
http://api.jquery.com/jQuery.hasData/
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".
la source
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 }
la source
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:
false
que si la valeur n'existe pas (estundefined
); s'il est défini surfalse
/,null
ilhasData()
reviendra toujourstrue
.$.hasData()
qui vérifie uniquement si des données sur l'élément sont définies.la source
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
id
de#dataTable
aussi a undata-timer
attribut, les étapes sont les suivantes:// Locate the element const myElement = document.getElementById('dataTable'); // Run conditional code if (myElement.dataset.hasOwnProperty('timer')) { [... CODE HERE...] }
la source
J'ai trouvé que cela fonctionne mieux avec des éléments de données définis dynamiquement:
if ($("#myelement").data('myfield')) { ... }
la source
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.
la source
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ù
$this
aucun objet de données n'a été créé,$.hasData
retournefalse
et 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)
, paselement.data(key, value)
. Pour cette raison, ma réponse n'est pas correcte.la source
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) { /* ....... */ }
la source
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(', ')); }
la source
.data('timer')
n'est pas défini, vous obtiendrez une TypeError: $ (...). Data (...) n'est pas défini lors de la vérificationdata.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.length
ailleurs. De plus, vous ne seriez pas nécessairement en mesure de dire avec certitude s'ildata
s'agit d'une chaîne, d'un tableau ou d'un objet, dont ce dernier peut ou non contenir enlength
tant que propriété définie.Vous pouvez vérifier par sélection d'attributs css avec
if ($('#dataTable').is('[data-timer]')) { // data-timer attribute exists }
la source
Et à propos de:
if ($('#dataTable[data-timer]').length > 0) { // logic here }
la source