有没有一种方法可以检查数据属性是否存在?
有什么办法可以运行以下内容:
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(', '));
只有在id为#dataTable的元素上有一个名为data-timer的属性?
if ($("#dataTable").attr('data-timer')) { ... }
if (typeof $("#dataTable").data('timer') !== 'undefined') { // your code here }
为了提供与上述不同的答案, 你可以像这样用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 } }
不是说这个解决scheme比其他任何解决scheme都好,但至less是另一种方法。
你可以使用jQuery的hasData方法。
http://api.jquery.com/jQuery.hasData/
jQuery.hasData(element)的主要优点是,如果当前不存在数据对象,则不会创build数据对象并将其与元素关联。 相比之下,jQuery.data(element)总是返回一个数据对象给调用者,如果以前没有数据对象,就创build一个。
这将只检查元素上是否存在任何数据对象(或事件),它将不能确认它是否具有“定时器”对象。
或者结合一些香草JS
if ($("#dataTable").get(0).hasAttribute("data-timer")) { ... }
你可以创build一个非常简单的jQuery插件来查询这个元素:
$.fn.hasData = function(key) { return (typeof $(this).data(key) != 'undefined'); };
然后你可以简单地使用$("#dataTable").hasData('timer')
陷阱:
- 只有当值不存在时才会返回
false
(undefined
); 如果设置为false
/null
则hasData()
将返回true
。 - 它不同于内置的
$.hasData()
,它只检查元素上的任何数据是否被设置。
如果你想区分空值和缺失值,你可以使用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 }
我发现这个工作更好地dynamic设置数据元素:
if ($("#myelement").data('myfield')) { ... }
错误的答案 – 请参阅最后的编辑
让我build立在亚历克斯的答案。
为了防止创build数据对象,如果它不存在,我最好做:
$.fn.hasData = function(key) { var $this = $(this); return $.hasData($this) && typeof $this.data(key) !== 'undefined'; };
然后, $this
没有创build数据对象, $.hasData
返回false
,它不会执行$this.data(key)
。
编辑:函数$.hasData(element)
只有在使用$.data(element, key, value)
而不是element.data(key, value)
设置数据时才起作用。 因此,我的答案是不正确的。
我需要一个简单的布尔值来处理。 因为它没有定义不存在,而不是假的,我使用!!
转换为布尔值:
var hasTimer = !!$("#dataTable").data('timer'); if( hasTimer ){ /* ....... */ }
另一种解决scheme是使用filter:
if( $("#dataTable").filter('[data-timer]').length!==0) { /* ....... */ }
这是我认为最简单的解决scheme是select具有一定数据属性的所有元素:
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(', '));
这是它的工作原理的截图。
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(', ')); }
你可以通过css属性select来检查
if ($('#dataTable').is('[data-timer]')) { // data-timer attribute exists }
那么呢:
if ($('#dataTable[data-timer]').length > 0) { // logic here }