데이터 속성이 존재하는지 확인할 수있는 방법이 있습니까?


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

답변:


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

참고 이것은 true데이터 속성이 빈 문자열 또는 "falsey"값이 아닌 경우 에만 반환 합니다 (예 : 0또는) false.

비어있는 경우에도 data 속성이 있는지 확인하려면 다음을 수행하십시오.

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

35
다른 옵션 : if ($("#dataTable[data-timer]").length) { ... }.
VisioN

101
조심해! data-timer에 값이있는 경우에만 true로 평가됩니다. 존재하지만 비어 있으면 false를 반환합니다.
Kong

15
빈 값이 있으면 코드가 작동하지 않습니다. 대신에 이것을 사용하십시오 : if (typeof $ ( "# dataTable"). attr ( 'data-timer')! == "undefined") {...}
PierrickM

22
조건부에 대한 실제 부울을 제공하는 또 다른 버전 : if ( $("#dataTable").is("[data-timer]") ) { ... }. 다른 jQuery 객체의 테이블에 대한 참조가 이미있는 경우에도 더 유용합니다.
Noyo

10
값이 존재하고 0과 같으면 false를 반환합니다. 기발한 것입니다.
Gherman

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

@VisioN 답변에 대한 귀하와 PierrickM 의 의견에 대한 안전한 조합 : . if (typeof $('#dataTable').data('timer') !== 'undefined') ...
WynandB

3
@ 와인드. 귀하와 VisioN의 의견을 반영하여 업데이트되었습니다.
Paul Fleming

1
@flem 또한 typeof체크인 에 추가해야합니다
Brendan Bullen

1
@flem, @VisioN, data 속성이없는 경우 접근 방식이 실패하지만 데이터는 여전히 .data () 메소드로 설정되었습니다 (예 :) $('#dataTable').data('timer', Date.now()). OP가 실제 데이터 속성이 있는지 확인하려고합니다. 이 경우 @niiru의 솔루션 (또는 해당 솔루션에 대한 의견으로 제공하는 솔루션)이 더 좋습니다.
Noyo

1
@VisioN 나에게 그것은 undefined일관된 방식으로 확인하는 것 입니다. 왜 우리는 알고 typeof를 확인하기 위해 사용되는 undefined경우에, 그러나 나는 그것이 확인되고보고 혼란을 찾을 것 와 함께 typeof 한 곳과 하지 않고 다른에서. 게다가, 그것은 사용하지 같은 typeof추가합니다 훨씬복잡한 코드. 좀 더 명시적일 수도 있고 아마도 중복 될 수도 있지만 지나치게 복잡하지 않을 수도 있습니다. 나는 당신의 요점을 알지만 그것을 사용하지 않으면 지나치게 단순화 될 것이라고 말하고 싶습니다. ;]
WynandB

38

위의 답변과 다른 답변을 제공하기 위해; 다음과 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

이 예제에서는 자바 스크립트 유효성 검사기를 사용합니다. typeof가 정의되지 않은 상태로 반환되었지만 작동했습니다!
Richard Housham

12

또는 바닐라 JS와 결합

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

난이게 좋아. 그러나 data()대신을 사용하여 jQuery를 사용하여 데이터를 작성하면 attr()속성을 찾을 수 없습니다. (
Sam

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-plugin을 만들어 요소를 쿼리 할 수 ​​있습니다.

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

그럼 당신은 단순히 사용할 수 있습니다 $("#dataTable").hasData('timer')

잡았다 :

  • false값이 존재하지 않는 경우에만 리턴 합니다 (is undefined). 이에 설정되어있는 경우 false/ null그것은 hasData()여전히 돌아갑니다 true.
  • 그것은 내장에서 다르다 $.hasData()있는 경우에만 검사를하면 어떤 요소에 대한 데이터가 설정됩니다.

3

동적으로 설정된 데이터 요소에서 더 잘 작동한다는 것을 알았습니다.

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

3

여기에있는 모든 답변은 jQuery 라이브러리를 사용합니다.

그러나 바닐라 자바 ​​스크립트는 매우 간단합니다.

당신이 가진 요소에만 스크립트를 실행하려는 경우 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

오답-마지막에 편집 참조

Alex의 답을 바탕으로하겠습니다.

데이터 객체가 존재하지 않는 경우 생성을 방지하려면 다음을 수행하는 것이 좋습니다.

$.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')가 정의되어 있지 않으면 TypeError가 발생합니다 : $ (...). data (...)는 확인할 때 정의되지 않습니다data.length . 이것은 OP의 질문의 기초 일 가능성이 높습니다. 즉, data.length다른 곳에서 안전하게 확인할 수 있는지 확인하십시오 . 게다가 data문자열, 배열 또는 객체 인지 여부를 반드시 확실하게 말할 수있는 것은 아니며 후자는 length정의 된 속성으로 포함하거나 포함하지 않을 수 있습니다 .
WynandB

예, 대답은 수정이 필요합니다. 2012 년에 작성되었습니다. 그러나 답을 이미 제시 했으므로 다시 쓰면 쓸모가 없습니다.
Luceos

0

당신은 CSS 속성 선택으로 확인할 수 있습니다

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

3
데이터 값이 항상 DOM 속성으로 저장되는 것은 아닙니다. $ .data를 사용하여 jQuery로 데이터 값을 수정하면 요소 속성으로 설정됩니다.
qwerty

0

그리고 어떻습니까 :

if ($('#dataTable[data-timer]').length > 0) {
    // logic here
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.