回答:
if ($("#dataTable").data('timer')) {
...
}
NOTEこのリターンだけtrueのデータ属性が空の文字列または「falsey」の値などはない場合0やfalse。
空であっても、data属性の存在を確認する場合は、次のようにします。
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
}
if (typeof $('#dataTable').data('timer') !== 'undefined') ...
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
}
非常に単純なjQueryプラグインを作成して、これについて要素をクエリできます。
$.fn.hasData = function(key) {
return (typeof $(this).data(key) != 'undefined');
};
その後、単純に使用できます $("#dataTable").hasData('timer')
落とし穴:
false値が存在しない(is undefined)場合にのみ戻ります。false/ nullに設定されている場合、hasData()それでも戻りtrueます。$.hasData()ただけのチェックがあれば任意の要素上のデータが設定されています。ここでのすべての回答はjQueryライブラリを使用しています。
しかし、バニラJavaScriptは非常に単純です。
idof の要素に#dataTable もdata-timer属性がある場合にのみスクリプトを実行する場合、手順は次のとおりです。
// Locate the element
const myElement = document.getElementById('dataTable');
// Run conditional code
if (myElement.dataset.hasOwnProperty('timer')) {
[... CODE HERE...]
}
これは私の意見では最も簡単な解決策であり、特定のデータ属性を持つすべての要素を選択することです:
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(', '));
間違った答え-最後にある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)。そのため、私の答えは正しくありません。
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定義済みのプロパティとして含んでいるかどうかわからない場合もあります。
あなたはCSS属性選択でチェックできます
if ($('#dataTable').is('[data-timer]')) {
// data-timer attribute exists
}
data-属性に何も格納されないこともありますが、jQueryにデータが格納され、その逆もあるということです。