มีวิธีใดที่ฉันสามารถตรวจสอบว่ามี data data อยู่หรือไม่?


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

เฉพาะในกรณีที่มีคุณลักษณะที่เรียกว่า data-timer บนองค์ประกอบที่มี id ของ #dataTable?


ข้อแม้หนึ่งที่ต้องระวังคือบางครั้งจะไม่มีสิ่งใดเก็บไว้ในdata-แอตทริบิวต์ แต่จะมีข้อมูลที่จัดเก็บใน jQuery และในทางกลับกัน
Alex W

คำตอบ:


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

หมายเหตุนี้ผลตอบแทนเท่านั้นtrueถ้าแอตทริบิวต์ข้อมูลไม่สตริงที่ว่างเปล่าหรือ "falsey" ค่าเช่นหรือ0false

หากคุณต้องการตรวจสอบว่ามี data data อยู่หรือไม่ให้ทำดังนี้:

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

35
ตัวเลือกอื่นสำหรับคุณ: if ($("#dataTable[data-timer]").length) { ... }.
VisioN

101
ระวัง! สิ่งนี้จะประเมินว่าเป็นจริงถ้าตัวจับเวลาข้อมูลมีค่า หากมีอยู่ แต่ว่างเปล่ามันจะส่งคืนค่าเท็จ

15
ฮ่องกงถูกต้องหากมีค่าว่างเปล่ารหัสของคุณใช้งานไม่ได้ ใช้สิ่งนี้แทน: if (typeof $ ("# dataTable"). attr ('data-timer')! == "undefined") {... }
PierrickM

22
อีกเวอร์ชันที่ให้บูลีนที่แท้จริงสำหรับเงื่อนไขของคุณ: if ( $("#dataTable").is("[data-timer]") ) { ... }. นอกจากนี้ยังมีประโยชน์มากขึ้นถ้าคุณมีการอ้างอิงไปยังตารางในวัตถุ jQuery อื่นแล้ว
Noyo

10
มันจะกลับเท็จถ้าค่าที่มีอยู่และเท่ากับ 0 นี่คือที่เล่นโวหาร
Gherman

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

@VisioN การรวมความคิดเห็นที่ไม่ปลอดภัยของคุณและPierrickMในคำตอบนี้ : if (typeof $('#dataTable').data('timer') !== 'undefined') ....
WynandB

3
@Wynand อัปเดตเพื่อแสดงถึงความคิดเห็นของคุณและ VisioN
Paul Fleming

1
@flem คุณต้องเพิ่มในการtypeofตรวจสอบ
Brendan Bullen

1
@flem, @VisioN วิธีการของคุณล้มเหลวในกรณีที่ไม่มีแอตทริบิวต์ข้อมูล แต่ข้อมูลยังคงรับการตั้งค่ากับ .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

สิ่งที่น่าสนใจในอินสแตนซ์นี้ด้วยเครื่องมือตรวจสอบ javascript typeof กลับมาไม่ได้กำหนด แต่ใช้งานได้!
Richard Housham

12

หรือรวมกับวานิลลา JS

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

ฉันชอบอันนี้ อย่างไรก็ตามคุณสร้างข้อมูลโดยใช้ jQuery โดยใช้data()แทนattr()จะไม่พบแอตทริบิวต์ :(
Sam

10

คุณสามารถใช้วิธี hasData ของ jQuery

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-simple ที่แสนง่ายเพื่อสืบค้นองค์ประกอบสำหรับสิ่งนี้:

$.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

คำตอบไม่ถูกต้อง - ดูการแก้ไขในตอนท้าย

ให้ฉันสร้างคำตอบของอเล็กซ์

เพื่อป้องกันการสร้างวัตถุข้อมูลถ้าไม่มีอยู่ฉันควรทำดังนี้

$.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

ใช่คำตอบของฉันต้องการการแก้ไข เขียนในปี 2012 .. แต่การเขียนใหม่มันจะไร้ประโยชน์ตามที่ได้รับคำตอบไว้แล้ว
Luceos

0

คุณสามารถตรวจสอบโดยการเลือกคุณสมบัติ css ด้วย

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

3
ค่าข้อมูลจะไม่ถูกจัดเก็บเป็นแอตทริบิวต์ DOM เมื่อคุณแก้ไขค่าข้อมูลด้วย jQuery โดยใช้ $ .data มันจะตั้งเป็นคุณสมบัติขององค์ประกอบ
qwerty

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.