Відповіді:
if ($("#dataTable").data('timer')) {
...
}
ПРИМІТКА це повертається лише в тому trueвипадку, якщо атрибут даних не є порожнім рядком або значенням "falsey", наприклад, 0або false.
Якщо ви хочете перевірити наявність атрибуту даних, навіть якщо він порожній, зробіть це:
if (typeof $("#dataTable").data('timer') !== 'undefined') {
...
}
if ($("#dataTable[data-timer]").length) { ... }.
if ( $("#dataTable").is("[data-timer]") ) { ... }. Це також корисніше, якщо ви вже маєте посилання на таблицю в іншому об’єкті jQuery.
if (typeof $("#dataTable").data('timer') !== 'undefined')
{
// your code here
}
typeofчек
$('#dataTable').data('timer', Date.now()). Здається, ОП хоче перевірити, чи є фактичний атрибут даних. Рішення @ niiru (або те, що ви запропонуєте в коментарі до цього рішення), в цьому випадку краще.
undefinedпослідовну перевірку . Ми знаємо , чому typeofвикористовуються для перевірки undefinedв деяких випадках, але я знаходжу це помилка , щоб побачити , що перевіряється з typeof в одному місці і НЕ в іншому. Крім того, це не схоже на використання typeofдодає багато більш складний код. Це може бути більш явним, можливо, надлишковим, але ледве надскладним. Я бачу вашу думку, але я б сказав, що не використовувати це було б надмірним спрощенням. ;]
В інтересах надання відповіді, відмінної від наведеної вище; ви можете це перевірити Object.hasOwnProperty(...)так:
if( $("#dataTable").data().hasOwnProperty("timer") ){
// the data-time property exists, now do you business! .....
}
альтернативно, якщо у вас є кілька елементів даних, які ви хочете повторити, ви можете змінити .data()об'єкт і повторити його так:
var objData = $("#dataTable").data();
for ( data in objData ){
if( data == 'timer' ){
//...do the do
}
}
Не кажучи, що це рішення краще, ніж будь-яке інше, але тут, принаймні, це інший підхід ...
data-foo-barто ваш чек повинен бути .data().hasOwnProperty("fooBar"), а не.data().hasOwnProperty("foo-bar")
Можна використовувати метод hasData jQuery.
http://api.jquery.com/jQuery.hasData/
Основна перевага jQuery.hasData (елемента) полягає в тому, що він не створює і не пов'язує об'єкт даних з елементом, якщо в даний час його немає. Навпаки, jQuery.data (елемент) завжди повертає об'єкт даних абоненту, створюючи його, якщо жодного об'єкта даних раніше не існувало.
Це лише перевірить наявність будь-яких об’єктів даних (або подій) на вашому елементі, він не зможе підтвердити, якщо в ньому конкретно є об’єкт «таймер».
Якщо ви хочете розрізнити порожні значення та відсутні значення, скористайтеся jQuery, щоб перевірити так.
<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>
Тож із оригінального питання ви б це зробили.
if("timer" in $("#dataTable").data()) {
// code
}
Ви можете створити надзвичайно простий плагін jQuery для запиту елемента для цього:
$.fn.hasData = function(key) {
return (typeof $(this).data(key) != 'undefined');
};
Тоді ви можете просто використовувати $("#dataTable").hasData('timer')
Отримав:
falseлише у тому випадку, якщо значення не існує (є undefined); якщо він встановлений в false/ nullвона hasData()буде повертати true.$.hasData()який перевіряє, чи встановлені якісь дані про елемент.Я виявив, що це працює краще з динамічно заданими елементами даних:
if ($("#myelement").data('myfield')) {
...
}
У всіх відповідях тут використовується бібліотека jQuery.
Але ванільний javascript дуже простий.
Якщо ви хочете запустити скрипт тільки якщо елемент з idз #dataTable також має data-timerатрибут, то кроки полягають в наступному:
// Locate the element
const myElement = document.getElementById('dataTable');
// Run conditional code
if (myElement.dataset.hasOwnProperty('timer')) {
[... CODE HERE...]
}
На мою думку, це найпростіший варіант вирішення питання - виділити весь елемент, який має певний атрибут даних:
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(', '));
Неправильна відповідь - дивіться редагувати наприкінці
Дозвольте мені спиратися на відповідь Алекса.
Щоб запобігти створенню об'єкта даних, якщо його не існує, я б краще:
$.fn.hasData = function(key) {
var $this = $(this);
return $.hasData($this) && typeof $this.data(key) !== 'undefined';
};
Тоді, де $thisне створено жодного об’єкта даних, $.hasDataповертається falseі він не буде виконуватись $this.data(key).
EDIT: функція $.hasData(element)працює лише в тому випадку, якщо дані були встановлені за допомогою $.data(element, key, value), а не element.data(key, value). Через це моя відповідь не вірна.
Мені потрібна була проста булева робота. Оскільки це не визначено, немає і не є помилковим, я використовую !!перетворення на булевий:
var hasTimer = !!$("#dataTable").data('timer');
if( hasTimer ){ /* ....... */ }
Альтернативним рішенням буде використання фільтра:
if( $("#dataTable").filter('[data-timer]').length!==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(', '));
}
.data('timer')не визначено, ви отримаєте TypeError: $ (...). Дані (...) не визначено під час перевірки data.length. Це, швидше за все, є основою питання ОП, тобто переконання, що можна сміливо перевіряти в data.lengthіншому місці. Крім того, ви не обов'язково зможете точно сказати, чи dataце рядок, масив чи об'єкт, останній може або не може містити lengthяк визначене властивість.
Ви можете перевірити вибір атрибутів css за допомогою
if ($('#dataTable').is('[data-timer]')) {
// data-timer attribute exists
}
data-атрибуті, але будуть дані, що зберігаються у jQuery і навпаки.