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


190

有什么办法可以运行以下命令:

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的属性时?


需要注意的一个警告是,有时data-属性中不会存储任何内容,但是jQuery中会存储数据,反之亦然。
Alex W

Answers:


295
if ($("#dataTable").data('timer')) {
  ...
}

注意,仅true当data属性不是空字符串或“ false”值(例如0或)时,此方法才返回false

如果要检查数据属性是否存在(即使为空),请执行以下操作:

if (typeof $("#dataTable").data('timer') !== 'undefined') {
  ...
}

35
您的另一种选择:if ($("#dataTable[data-timer]").length) { ... }
2012年

101
小心!仅当数据计时器具有值时,此评估结果才为true。如果存在但为空,它将返回false。

15
Kong是对的,如果有一个空值,您的代码将无效。请改用它:if(typeof $(“#dataTable”)。attr('data-timer')!==“ undefined”){...}
PierrickM 2013年

22
另一个为您的条件提供实际布尔值的版本:if ( $("#dataTable").is("[data-timer]") ) { ... }。如果您已经在另一个jQuery对象中具有对该表的引用,那么它也将更加有用。
Noyo

10
如果该值存在并且等于0,它将返回false。这很奇怪。
Gherman

111
if (typeof $("#dataTable").data('timer') !== 'undefined')
{
    // your code here
}

@VisioN您和PierrickM答案上的评论的失败安全组合:if (typeof $('#dataTable').data('timer') !== 'undefined') ...
WynandB

3
@Wynand。已更新以反映您和VisioN的评论。
保罗·弗莱明

1
@flem您还需要添加typeof支票
Brendan Bullen

1
@ flem,@ VisioN,如果没有数据属性,但是仍然使用.data()方法设置数据,例如,,则您的方法将失败$('#dataTable').data('timer', Date.now())。看来OP希望检查实际数据属性是否存在。在这种情况下,@ niiru的解决方案(或您在对该解决方案的评论中提供的解决方案)更好。
Noyo 2013年

1
@VisioN对我来说undefined,是以一致的方式进行检查。我们知道为什么typeof被用于检查undefined在某些情况下,但我觉得它混淆看到它被检查 typeof在一个地方,没有别人了。此外,它并不像使用typeof增添了许多复杂的代码。它可能更明确,也许最多是多余的,但几乎不会太复杂。虽然我明白您的意思,但我想说不使用它会过于简单化。;]
WynandB 2014年

37

为了提供与上述答案不同的答案;您可以这样检查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
      }
 }

并不是说这个解决方案比这里的任何其他解决方案都要好,但至少是另一种方法...


9
这很有趣,但应注意的是,如果你有属性,data-foo-bar那么你的支票必须.data().hasOwnProperty("fooBar"),不.data().hasOwnProperty("foo-bar")
dgmstuart

在这种情况下,使用JavaScript验证程序很有趣。该typeof返回undefined,但这行得通!
理查德·侯赛姆

12

或结合一些香草JS

if ($("#dataTable").get(0).hasAttribute("data-timer")) {
  ...
}

10

您可以使用jQuery的hasData方法。

http://api.jquery.com/jQuery.hasData/

jQuery.hasData(element)的主要优点是,如果当前不存在数据对象,则它不会创建数据对象并将其与元素关联。相反,jQuery.data(element)始终将数据对象返回给调用方,如果以前不存在数据对象,则创建一个数据对象。

这只会检查元素上是否存在任何数据对象(或事件),无法确认它是否特别具有“计时器”对象。


10

如果要区分空值和缺失值,可以使用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
}

7

您可以创建一个非常简单的jQuery插件来查询元素:

$.fn.hasData = function(key) {
  return (typeof $(this).data(key) != 'undefined');
};

然后,您可以简单地使用 $("#dataTable").hasData('timer')

陷阱:

  • false仅当该值不存在(是undefined)时才返回;如果将其设置为false/ nullhasData()它将仍然返回true
  • 它与$.hasData()仅检查元素上是否设置了任何数据的内置方法不同。

3

我发现这对于动态设置数据元素更好:

if ($("#myelement").data('myfield')) {
  ...
}

3

这里所有的答案都使用jQuery库。

但是香草javascript非常简单。

如果您只想在带有的元素具有属性的情况id下运行脚本,则步骤如下:#dataTable data-timer

// Locate the element

const myElement = document.getElementById('dataTable');

// Run conditional code

if (myElement.dataset.hasOwnProperty('timer')) {

  [... CODE HERE...]

}

2

我认为这是最简单的解决方案,就是选择具有特定数据属性的所有元素:

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选择器的控制台日志


1

答案错误-参见最后的编辑

让我以亚历克斯的答案为基础。

为了防止创建不存在的数据对象,我最好这样做:

$.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)。因此,我的答案不正确。


1

我需要一个简单的布尔值来使用。因为它是不确定的,不存在,也不是假,所以我使用将!!转换为布尔值:

var hasTimer = !!$("#dataTable").data('timer');
if( hasTimer ){ /* ....... */ }

另一种解决方案是使用过滤器:

if( $("#dataTable").filter('[data-timer]').length!==0) { /* ....... */ }

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')没有定义,你会得到一个类型错误:$(...)数据(...)处于不确定状态。当检查data.length。这很可能是OP的问题的基础,即确保一个人可以安全地检查data.length其他地方。此外,您不一定能够确定data是字符串,数组还是对象,后者可能包含也可能不包含length作为定义的属性。
WynandB

是的,我的答案需要修改。写于2012年。但是由于已经给出了答案,因此对其进行重写将无济于事。
Luceos

0

您可以使用以下命令检查CSS属性选择

if ($('#dataTable').is('[data-timer]')) {
   // data-timer attribute exists
}

3
数据值并不总是存储为DOM属性。当您使用jQuery使用$ .data修改数据值时,会将其设置为element属性。
qwerty 2014年

0

然后呢:

if ($('#dataTable[data-timer]').length > 0) {
    // logic here
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.