Answers:
if ($("#dataTable").data('timer')) {
...
}
注意,仅true
当data属性不是空字符串或“ false”值(例如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())
。看来OP希望检查实际数据属性是否存在。在这种情况下,@ 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")
您可以使用jQuery的hasData方法。
http://api.jquery.com/jQuery.hasData/
jQuery.hasData(element)的主要优点是,如果当前不存在数据对象,则它不会创建数据对象并将其与元素关联。相反,jQuery.data(element)始终将数据对象返回给调用方,如果以前不存在数据对象,则创建一个数据对象。
这只会检查元素上是否存在任何数据对象(或事件),无法确认它是否特别具有“计时器”对象。
如果要区分空值和缺失值,可以使用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
}
我认为这是最简单的解决方案,就是选择具有特定数据属性的所有元素:
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)
。
编辑:$.hasData(element)
仅当使用$.data(element, key, value)
而不是设置数据时,该功能才有效element.data(key, value)
。因此,我的答案不正确。
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')
没有定义,你会得到一个类型错误:$(...)数据(...)处于不确定状态。当检查data.length
。这很可能是OP的问题的基础,即确保一个人可以安全地检查data.length
其他地方。此外,您不一定能够确定data
是字符串,数组还是对象,后者可能包含也可能不包含length
作为定义的属性。
您可以使用以下命令检查CSS属性选择
if ($('#dataTable').is('[data-timer]')) {
// data-timer attribute exists
}
data-
属性中不会存储任何内容,但是jQuery中会存储数据,反之亦然。