Existe-t-il un moyen de gérer les éléments suivants:
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(', '));
Only s'il existe un attribut appelé data-timer sur l'élément avec un identifiant de #dataTable?
if ($("#dataTable").data('timer')) {
...
}
REMARQUE: ceci renvoie uniquement true
si l'attribut de données n'est pas une chaîne vide ou une valeur "falsey", par ex. 0
ou false
.
Si vous voulez vérifier l'existence de l'attribut data, même s'il est vide, procédez comme suit:
if (typeof $("#dataTable").data('timer') !== 'undefined') {
...
}
if (typeof $("#dataTable").data('timer') !== 'undefined')
{
// your code here
}
Dans l’intérêt de fournir une réponse différente de celle indiquée ci-dessus; vous pouvez le vérifier avec Object.hasOwnProperty(...)
comme ceci:
if( $("#dataTable").data().hasOwnProperty("timer") ){
// the data-time property exists, now do you business! .....
}
alternativement, si vous souhaitez parcourir plusieurs éléments de données, vous pouvez modifier l'objet .data()
et le parcourir comme suit:
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 ...
Ou combinez avec un peu de vanille JS
if ($("#dataTable").get(0).hasAttribute("data-timer")) {
...
}
Vous pouvez utiliser la méthode hasData de jQuery.
http://api.jquery.com/jQuery.hasData/
Le principal avantage de jQuery.hasData (element) est qu'il ne crée pas et n'associe pas d'objet de données à l'élément s'il n'en existe aucun. En revanche, jQuery.data (élément) renvoie toujours un objet de données à l'appelant, en créant un si aucun objet de données n'existait auparavant.
Cela ne fera que vérifier l'existence d'objets de données (ou d'événements) sur votre élément, il ne sera pas en mesure de confirmer s'il contient spécifiquement un objet "timer".
Si vous voulez faire la distinction entre les valeurs vides et les valeurs manquantes, vous pouvez utiliser jQuery pour le vérifier.
<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 ceci.
if("timer" in $("#dataTable").data()) {
// code
}
Vous pouvez créer un plugin jQuery extrêmement simple pour interroger un élément à cet effet:
$.fn.hasData = function(key) {
return (typeof $(this).data(key) != 'undefined');
};
Ensuite, vous pouvez simplement utiliser $("#dataTable").hasData('timer')
Gotchas:
false
uniquement si la valeur n'existe pas (is undefined
); s'il est réglé sur false
/null
il hasData()
retournera toujours true
.$.hasData()
intégrée qui vérifie uniquement si toutes les données de l'élément sont définies.J'ai trouvé que cela fonctionnait mieux avec des éléments de données définis de manière dynamique:
if ($("#myelement").data('myfield')) {
...
}
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
n'a pas d'objet de données créé, $.hasData
renvoie false
et il n'exécutera pas $this.data(key)
.
EDIT: La fonction $.hasData(element)
ne fonctionne que si les données ont été définies à l'aide de $.data(element, key, value)
et non pas element.data(key, value)
. Pour cette raison, ma réponse n'est pas correcte.
Ceci est la solution la plus simple à mon avis est de sélectionner tous les éléments ayant 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(', '));
Il me fallait un simple booléen. Comme il est indéfini de non présent et non faux, j'utilise le !!
pour convertir en booléen:
var hasTimer = !!$("#dataTable").data('timer');
if( hasTimer ){ /* ....... */ }
Une autre solution serait d'utiliser un filtre:
if( $("#dataTable").filter('[data-timer]').length!==0) { /* ....... */ }
Vous pouvez vérifier par sélection d'attribut css avec
if ($('#dataTable').is('[data-timer]')) {
// data-timer attribute exists
}
Et à propos de:
if ($('#dataTable[data-timer]').length > 0) {
// logic here
}
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(', '));
}