Есть ли способ, которым я могу запустить следующее:
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(', '));
Только если в элементе есть атрибут data-timer с идентификатором #dataTable?
javascript
jquery
Angela
источник
источник
data-
атрибуте ничего не хранится, но в jQuery хранятся данные и наоборот.Ответы:
Обратите внимание , это только возвращается ,
true
если атрибут данных не является пустой строкой или «falsey» значение , например ,0
илиfalse
.Если вы хотите проверить наличие атрибута данных, даже если он пуст, сделайте следующее:
источник
if ($("#dataTable[data-timer]").length) { ... }
.if ( $("#dataTable").is("[data-timer]") ) { ... }
. Это также более полезно, если у вас уже есть ссылка на таблицу в другом объекте jQuery.источник
if (typeof $('#dataTable').data('timer') !== 'undefined') ...
.typeof
чек$('#dataTable').data('timer', Date.now())
. Похоже, что ОП хочет проверить наличие фактического атрибута данных. Решение @ niiru (или предложение, которое вы предлагаете в комментарии к этому решению) в этом случае лучше.undefined
постоянной основе. Мы знаем , почемуtypeof
используются для проверкиundefined
в некоторых случаях, но я нахожу это заблуждение , чтобы увидеть , что проверяется сtypeof
в одном месте и не в другом. Кроме того, это не то же самое, что использованиеtypeof
добавляет намного более сложный код. Это может быть более явным, возможно, в большинстве случаев избыточным, но вряд ли слишком сложным. Хотя я понимаю вашу точку зрения, но я бы сказал, что не использовать это было бы упрощением. ;]В интересах предоставления ответа, отличного от приведенного выше; Вы можете проверить это
Object.hasOwnProperty(...)
следующим образом:альтернативно, если у вас есть несколько элементов данных, которые вы хотите перебрать, вы можете варьировать
.data()
объект и перебирать его следующим образом:Не сказать, что это решение лучше, чем любое другое здесь, но, по крайней мере, это другой подход ...
источник
data-foo-bar
тогда ваш чек должен быть.data().hasOwnProperty("fooBar")
, а не.data().hasOwnProperty("foo-bar")
Или в сочетании с ванильным JS
источник
data()
вместо этого jQueryattr()
, он не найдет атрибут :(Вы можете использовать метод hasData в jQuery.
http://api.jquery.com/jQuery.hasData/
Это будет только проверять наличие каких-либо объектов данных (или событий) в вашем элементе, оно не сможет подтвердить, есть ли у него объект «таймер».
источник
Если вы хотите различать пустые значения и пропущенные значения, вы можете использовать jQuery для проверки следующим образом.
Исходя из исходного вопроса, вы бы это сделали.
источник
Вы можете создать чрезвычайно простой jQuery-плагин для запроса элемента:
Тогда вы можете просто использовать
$("#dataTable").hasData('timer')
Gotchas:
false
только если значение не существует (естьundefined
); если он установлен вfalse
/null
онhasData()
все равно вернетсяtrue
.$.hasData()
который только проверяет, установлены ли какие-либо данные для элемента.источник
Я обнаружил, что это работает лучше с динамически установленными элементами данных:
источник
Все ответы здесь используют библиотеку jQuery.
Но ванильный JavaScript очень прост.
Если вы хотите запустить сценарий только в том случае, если элемент с параметром
id
of#dataTable
также имеетdata-timer
атрибут, выполните следующие шаги:источник
По моему мнению, это самое простое решение - выбрать все элементы, которые имеют определенный атрибут данных:
Вот скриншот того, как это работает.
источник
Неправильный ответ - см. РЕДАКТИРОВАТЬ в конце
Позвольте мне опираться на ответ Алекса.
Чтобы предотвратить создание объекта данных, если он не существует, я бы лучше сделал:
Затем, где
$this
не создан объект данных,$.hasData
возвращается,false
и он не будет выполняться$this.data(key)
.РЕДАКТИРОВАТЬ: функция
$.hasData(element)
работает, только если данные были установлены с использованием$.data(element, key, value)
, а неelement.data(key, value)
. Из-за этого мой ответ не верен.источник
Мне нужно было простое логическое значение для работы с. Поскольку он не определен как не присутствует и не имеет значения false, я использую его
!!
для преобразования в логическое значение:Альтернативное решение будет использовать фильтр:
источник
источник
.data('timer')
не определено, вы получите ошибку TypeError: $ (...). Data (...) при проверке не определяетсяdata.length
. Скорее всего, это основа вопроса ОП, то есть обеспечение того, чтобы можно было безопасно проверить вdata.length
другом месте. Кроме того, вы не обязательно сможете точно сказать,data
является ли строка, массив или объект, который последний может содержать или не содержатьlength
в качестве определенного свойства.Вы можете проверить выбор атрибута css с помощью
источник
И что насчет:
источник