Esiste un modo per verificare se esiste un attributo di dati?


190

Esiste un modo per eseguire quanto segue:

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

Solo se esiste un attributo chiamato data-timer sull'elemento con un ID di #dataTable?


Un avvertimento da tenere presente è che a volte non ci sarà nulla memorizzato in un data-attributo ma ci saranno dati memorizzati in jQuery e viceversa.
Alex W,

Risposte:


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

NOTA questo ritorna solo truese l'attributo data non è una stringa vuota o un valore "falso", ad esempio 0o false.

Se si desidera verificare l'esistenza dell'attributo data, anche se vuoto, procedere come segue:

if (typeof $("#dataTable").data('timer') !== 'undefined') {
  ...
}

35
Un'altra opzione per voi: if ($("#dataTable[data-timer]").length) { ... }.
VisioN,

101
Stai attento! Ciò viene considerato vero solo se il timer dei dati ha un valore. Se è presente, ma vuoto restituirà false.
Kong,

15
Kong ha ragione, se c'è un valore vuoto il tuo codice non funziona. Usa questo invece: if (typeof $ ("# dataTable"). Attr ('data-timer')! == "undefined") {...}
PierrickM

22
Ancora un'altra versione che ti dà un valore booleano effettivo per il proprio condizionale: if ( $("#dataTable").is("[data-timer]") ) { ... }. È anche più utile se hai già un riferimento alla tabella in un altro oggetto jQuery.
Noyo,

10
Restituirà false se il valore esiste ed è uguale a 0. Questo è eccentrico.
Gherman,

112
if (typeof $("#dataTable").data('timer') !== 'undefined')
{
    // your code here
}

@VisioN Un fail-safe combinazione di tuo e PierrickM 's commento su questo risposta: if (typeof $('#dataTable').data('timer') !== 'undefined') ....
WynandB,

3
@Wynand. Aggiornato per riflettere il tuo commento di VisioN.
Paul Fleming,

1
@flem Devi anche aggiungere l' typeofassegno
Brendan Bullen,

1
@flem, @VisioN, i tuoi approcci falliscono nel caso in cui non ci siano attributi di dati, ma i dati sono ancora stati impostati con il metodo .data (), ad es $('#dataTable').data('timer', Date.now()). Sembra che l'OP voglia verificare che sia presente l'attributo dati reale. La soluzione di @ niiru (o quella che offri in un commento a quella soluzione) è migliore, in questo caso.
Noyo,

1
@VisioN Per me si tratta di verificare undefinedin modo coerente. Sappiamo perché typeofè usato per verificare undefinedin alcuni casi, ma troverei confuso vedere che veniva controllato con typeof in un posto e senza in un altro. Inoltre, non è come usare typeofaggiunge un codice molto più complicato . Può essere più esplicito, forse ridondante al massimo ma difficilmente complicato. Vedo il tuo punto però, ma direi che non usarlo sarebbe una semplificazione eccessiva. ;]
WynandB,

38

Nell'interesse di fornire una risposta diversa da quelle sopra; puoi verificarlo in Object.hasOwnProperty(...)questo modo:

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

in alternativa, se si hanno più elementi di dati su cui si desidera iterare, è possibile variare l' .data()oggetto e iterarlo in questo modo:

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

Non dire che questa soluzione è migliore di tutte le altre qui, ma almeno è un altro approccio ...


9
Questo è interessante, ma va notato che se si dispone dell'attributo, data-foo-baril controllo deve essere .data().hasOwnProperty("fooBar"), non.data().hasOwnProperty("foo-bar")
dgmstuart

Interessante in questo caso con il validatore javascript. Il tipo di ritorno non è stato definito, ma ha funzionato!
Richard Housham,

12

O combinalo con un po 'di JS alla vaniglia

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

Mi piace questa. Tuttavia, si creano i dati utilizzando jQuery utilizzando data()invece di attr(), non troverà l'attributo :(
Sam

10

È possibile utilizzare il metodo hasData di jQuery.

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

Il vantaggio principale di jQuery.hasData (elemento) è che non crea e associa un oggetto dati all'elemento se non esiste attualmente. Al contrario, jQuery.data (element) restituisce sempre un oggetto dati al chiamante, creandone uno se in precedenza non esisteva alcun oggetto dati.

Questo verificherà solo l'esistenza di oggetti dati (o eventi) sul tuo elemento, non sarà in grado di confermare se ha specificamente un oggetto "timer".


10

Se si desidera distinguere tra valori vuoti e valori mancanti, è possibile utilizzare jQuery per verificare in questo modo.

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

Quindi dalla domanda originale lo faresti.

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

7

È possibile creare un plugin jQuery estremamente semplice per eseguire una query su un elemento per questo:

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

Quindi puoi semplicemente usare $("#dataTable").hasData('timer')

Trabocchetti:

  • Restituirà falsesolo se il valore non esiste (è undefined); se è impostato su false/ nulllo hasData()sarà ancora di ritornotrue .
  • E 'diverso dal built-in $.hasData(), che controlla solo se tutti i dati del elemento è impostato.

3

Ho trovato che funziona meglio con gli elementi di dati impostati dinamicamente:

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

3

Tutte le risposte qui usano la libreria jQuery.

Ma il javascript alla vaniglia è molto semplice.

Se si desidera eseguire uno script solo se l'elemento con un iddi ha #dataTable anche un data-timerattributo, i passaggi sono i seguenti:

// Locate the element

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

// Run conditional code

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

  [... CODE HERE...]

}

2

Questa è la soluzione più semplice secondo me è quella di selezionare tutti gli elementi che hanno determinati attributi di dati:

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

Ecco lo screenshot di come funziona.

registro della console del selettore jquery


1

Risposta errata: vedere EDIT alla fine

Vorrei basarmi sulla risposta di Alex.

Per impedire la creazione di un oggetto dati se non esiste, farei meglio a:

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

Quindi, dove $thisnon è stato creato alcun oggetto dati, $.hasDataritorna falsee non verrà eseguito $this.data(key).

EDIT: la funzione $.hasData(element)funziona solo se i dati sono stati impostati usando $.data(element, key, value), no element.data(key, value). Per questo motivo, la mia risposta non è corretta.


1

Avevo bisogno di un semplice booleano con cui lavorare. Perché è indefinito di non presente e non falso, io uso il !!per convertire in booleano:

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

Una soluzione alternativa sarebbe usare il filtro:

if( $("#dataTable").filter('[data-timer]').length!==0) { /* ....... */ }

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

Se .data('timer')non è definito, si ottiene un TypeError: $ (...). Data (...) non è definito durante il controllo data.length. Questa è probabilmente la base della domanda del PO, ovvero assicurarsi che si possa verificare in sicurezza data.lengthaltrove. Inoltre, non saresti necessariamente in grado di dire con certezza se si datatratta di una stringa, una matrice o un oggetto, di cui quest'ultimo può o meno contenere lengthuna proprietà definita.
WynandB,

Sì, la mia risposta necessita di revisione. Scritto nel 2012 .. Ma riscriverlo sarebbe inutile poiché la risposta è già stata data.
Luceos,

0

È possibile controllare selezionando l'attributo css con

if ($('#dataTable').is('[data-timer]')) {
   // data-timer attribute exists
}

3
I valori dei dati non vengono sempre archiviati come attributi DOM. Quando modifichi i valori dei dati con jQuery usando $ .data, li imposta come proprietà element.
qwerty,

0

E che mi dici di:

if ($('#dataTable[data-timer]').length > 0) {
    // logic here
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.