क्या कोई तरीका है जो मैं जांच सकता हूं कि क्या कोई डेटा विशेषता मौजूद है?


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 की आईडी के साथ तत्व पर डेटा-टाइमर नामक एक विशेषता है?


इसके बारे में पता करने के लिए एक चेतावनी यह है कि कभी-कभी एक data-विशेषता में संग्रहीत कुछ भी नहीं होगा लेकिन jQuery और इसके विपरीत में संग्रहीत डेटा होगा।
एलेक्स डब्ल्यू

जवाबों:


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

यह केवल तभी नोट करें trueजब डेटा विशेषता खाली स्ट्रिंग या "गलत" मान उदा 0या नहीं है false

यदि आप डेटा विशेषता के अस्तित्व की जाँच करना चाहते हैं, भले ही खाली हो, तो यह करें:

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

35
आपके लिए एक और विकल्प if ($("#dataTable[data-timer]").length) { ... }:।
15

101
सावधान रहे! यदि डेटा-टाइमर का मान है, तो यह केवल सही का मूल्यांकन करता है। यदि यह मौजूद है, लेकिन खाली है तो यह गलत होगा।
कोंग

15
यदि आपका कोड कोड काम नहीं करता है तो खाली मान रखने पर कोंग सही है। इसके बजाय इसका उपयोग करें: यदि (टाइपऑफ़ $ ("# dataTable")। attr ('डेटा-टाइमर') =! == "अपरिभाषित") {...}
PierrickM

22
अभी तक एक और संस्करण जो आपको आपकी सशर्त के लिए एक वास्तविक बूलियन देता है if ( $("#dataTable").is("[data-timer]") ) { ... }:। यदि आप पहले से ही किसी अन्य jQuery ऑब्जेक्ट में तालिका का संदर्भ रखते हैं तो यह और भी उपयोगी है।
नॉयो

10
यदि मान मौजूद है और यह 0. के बराबर है, तो यह गलत हो जाएगा।
घर्मन

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

@VisioN एक असफल-सुरक्षित अपने और के संयोजन PierrickM पर की टिप्पणी इस सवाल का जवाब: if (typeof $('#dataTable').data('timer') !== 'undefined') ...
WynandB

3
@Wynand। आपकी और VisioN की टिप्पणी को दर्शाने के लिए अद्यतन किया गया।
पॉल फ्लेमिंग

1
@flem आपको typeofचेक में जोड़ना होगा
ब्रेंडन

1
@flem, @VisioN, आपके दृष्टिकोण उस स्थिति में विफल हो जाते हैं जहां कोई डेटा विशेषता नहीं है, लेकिन डेटा अभी भी .data () विधि के साथ सेट है, उदा $('#dataTable').data('timer', Date.now())। ऐसा लगता है कि ओपी यह जांचना चाहता है कि वास्तविक डेटा विशेषता क्या है। @ नीरू का समाधान (या आप उस समाधान के लिए एक टिप्पणी में पेश करते हैं) बेहतर है, इस मामले में।
नोयो

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

जावास्क्रिप्ट सत्यापनकर्ता के साथ इस उदाहरण में दिलचस्प है। टाइपोफ़ अपरिभाषित लौट आया, लेकिन यह काम कर गया!
रिचर्ड हाशम

12

या कुछ वेनिला जेएस के साथ गठबंधन करें

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

मैं यह पसंद है। हालाँकि, आप data()इसके बजाय jQuery का उपयोग करके डेटा बनाते हैं attr(), यह विशेषता नहीं पाएगा :(
सैम

10

आप jQuery की hasData विधि का उपयोग कर सकते हैं।

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

JQuery.hasData (तत्व) का प्राथमिक लाभ यह है कि यह तत्व के साथ डेटा ऑब्जेक्ट को नहीं बनाता है और संबद्ध करता है यदि वर्तमान में कोई भी मौजूद नहीं है। इसके विपरीत, jQuery.data (तत्व) हमेशा कॉल करने वाले को एक डेटा ऑब्जेक्ट लौटाता है, अगर कोई डेटा ऑब्जेक्ट पहले से मौजूद नहीं है।

यह केवल आपके तत्व पर मौजूद किसी भी डेटा ऑब्जेक्ट (या ईवेंट) के अस्तित्व की जांच करेगा, यह पुष्टि करने में सक्षम नहीं होगा कि क्या यह विशेष रूप से "टाइमर" ऑब्जेक्ट है।


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

gotchas:

  • falseतभी लौटेगा जब मूल्य मौजूद नहीं है (है 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

गलत उत्तर - अंत में EDIT देखें

मुझे एलेक्स के जवाब पर बनाने दें।

डेटा ऑब्जेक्ट के निर्माण को रोकने के लिए यदि यह मौजूद नहीं है, तो मैं बेहतर करूंगा:

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

फिर, जहां $thisकोई डेटा ऑब्जेक्ट नहीं बनाया गया है, $.hasDataरिटर्न करता है falseऔर यह निष्पादित नहीं करेगा $this.data(key)

EDIT: फ़ंक्शन $.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 । यह सबसे अधिक संभावना है कि ओपी के सवाल का आधार, यानी यह सुनिश्चित करना कि कोई data.lengthअन्य जगह सुरक्षित रूप से जांच कर सकता है। इसके अलावा, आप निश्चित रूप से यह नहीं कह पाएंगे कि क्या dataएक स्ट्रिंग, एक सरणी या एक वस्तु है, जिसमें से बाद lengthमें एक परिभाषित संपत्ति के रूप में शामिल हो सकता है या नहीं हो सकता है ।
WynandB

हां मेरे जवाब में संशोधन की जरूरत है। 2012 में लिखा गया था। लेकिन इसे फिर से लिखना बेकार होगा क्योंकि जवाब पहले ही दिया जा चुका है।
लॉज़ोस

0

आप के साथ css विशेषता चयन द्वारा जाँच कर सकते हैं

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

3
डेटा मान हमेशा DOM विशेषताओं के रूप में संग्रहीत नहीं होते हैं। जब आप $ .data का उपयोग करके jQuery के साथ डेटा मानों को संशोधित करते हैं, तो यह इसे एक तत्व गुण के रूप में सेट करता है।
क्वर्टी

0

और क्या इस बारे में:

if ($('#dataTable[data-timer]').length > 0) {
    // logic here
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.