有没有一种方法可以检查数据属性是否存在?

有什么办法可以运行以下内容:

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

陷阱:

  • 只有当值不存在时才会返回falseundefined ); 如果设置为false / nullhasData()将返回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(', ')); 

这是它的工作原理的截图。

控制台日志的jquery选择器

 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 }