データ属性が存在するかどうかを確認する方法はありますか?


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(', '));

#dataTableのIDを持つ要素にdata-timerという属性がある場合のみ


注意すべき1つの注意点は、data-属性に何も格納されないこともありますが、jQueryにデータが格納され、その逆もあるということです。
Alex W

回答:


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

NOTEこのリターンだけtrueのデータ属性が空の文字列または「falsey」の値などはない場合0false

空であっても、data属性の存在を確認する場合は、次のようにします。

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

35
あなたのための別のオプション:if ($("#dataTable[data-timer]").length) { ... }
VisioN 2012

101
注意してください!これは、データタイマーに値がある場合にのみtrueと評価されます。存在するが空の場合はfalseを返します。
Kong

15
Kongは正しいです。空の値がある場合、コードは機能しません。代わりにこれを使用してください:if(typeof $( "#dataTable")。attr( 'data-timer')!== "undefined"){...}
PierrickM

22
条件付きの実際のブール値を提供するさらに別のバージョン:if ( $("#dataTable").is("[data-timer]") ) { ... }。また、別のjQueryオブジェクトのテーブルへの参照がすでにある場合にも役立ちます。
Noyo、

10
値が存在し、値が0の場合はfalseを返します。これは風変わりです。
ガーマン、2015

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

@VisioN この回答に関するあなたとPierrickMのコメントのフェイルセーフな組み合わせ:。if (typeof $('#dataTable').data('timer') !== 'undefined') ...
WynandB 2013年

3
@Wynand。あなたとVisioNのコメントを反映して更新されました。
ポールフレミング

1
@flemまた、typeof小切手を追加する必要があります
ブレンダンブレン

1
@ flem、@ VisioN、データ属性がない場合、アプローチは失敗しますが、データは.data()メソッドで設定されてい$('#dataTable').data('timer', Date.now())ます。OPは、実際のデータ属性が存在することを確認したいようです。この場合、@ niiruの解決策(またはその解決策に対するコメントで提供する解決策)の方が優れています。
Noyo、

1
@VisioN私にとってundefinedは、一貫した方法でチェックすることです。なぜtypeofがチェックに使用される場合があるのかはわかっundefinedています typeof、ある場所でチェックれ、別の場所でチェックないのを見ると混乱するでしょう。さらに、それを使用することtypeofは、はるか複雑なコードを追加するようなものではありません。それはもっと明白かもしれません、多分せいぜい冗長ですが、あまり複雑ではありません。私はあなたの要点を理解していますが、それを使わないのは単純化しすぎだと思います。;]
WynandB 2014

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

このインスタンスでは、JavaScriptバリデーターが興味深いものです。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プラグインを作成して、これについて要素をクエリできます。

$.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ライブラリを使用しています。

しかし、バニラJavaScriptは非常に単純です。

idof の要素に#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

間違った答え-最後にあるEDITを参照してください

アレックスの答えを基にしてみましょう。

データオブジェクトが存在しない場合に作成されないようにするには、次のようにします。

$.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.length。これは、おそらくOPの質問の根拠、つまり、data.length他の場所で安全にチェックできることを確認することです。さらに、data文字列、配列、オブジェクトのいずれであるかを、必ずしも後者がlength定義済みのプロパティとして含んでいるかどうかわからない場合もあります。
WynandB 2013年

はい、私の答えは修正が必要です。2012年に書かれました。しかし、答えはすでに与えられているので、それを書き直すことは無意味でしょう。
Luceos 2013年

0

あなたはCSS属性選択でチェックできます

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

3
データ値は常にDOM属性として格納されるわけではありません。$ .dataを使用してjQueryでデータ値を変更すると、要素のプロパティとして設定されます。
qwerty 2014

0

そして何について:

if ($('#dataTable[data-timer]').length > 0) {
    // logic here
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.