วิธีการตรวจสอบวัตถุว่างใน jQuery


169

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

if($("#btext" + i) != null) {
    //alert($("#btext" + i).text());
    $("#btext" + i).text("Branch " + i);
}

ฉันจะตรวจสอบการมีอยู่ขององค์ประกอบได้อย่างไร

คำตอบ:


251

ตรวจสอบคำถามที่พบบ่อยของ jQuery ...

คุณสามารถใช้คุณสมบัติความยาวของคอลเลกชัน jQuery ที่ส่งคืนโดยตัวเลือกของคุณ:

if ( $('#myDiv').length ){}

คุณคิดอย่างไรเกี่ยวกับ var _myDiv = $ ('# myDiv'); ... .... if (_myDiv.lenght) {... } สร้างข้อยกเว้น
นูริ YILMAZ

1
ตามที่ eleotlecram พูด; หลีกเลี่ยงความยาวได้ดีกว่า
numediaweb

5
@AurelianoBuendia คุณได้ใช้lenghtแทนlength; มันเป็นข้อผิดพลาดการสะกดคำ
แซม

4
@numediaweb, eleotlecram .lengthไม่ได้พูดเพื่อหลีกเลี่ยง
แซม

1
แต่ .. คุณจะไม่ได้รับข้อผิดพลาด "ไม่สามารถอ่านคุณสมบัติ 'ความยาว' เป็นโมฆะได้หรือไม่
Sagive SEO

61

(เนื่องจากฉันดูเหมือนจะมีชื่อเสียงไม่พอที่จะโหวตคำตอบ ... )

Wolfเขียนว่า:

การโทรหาคุณสมบัติความยาวบนที่ไม่ได้กำหนดหรือวัตถุว่างเปล่าจะทำให้เบราว์เซอร์ IE และ webkit ล้มเหลว!

ลองทำสิ่งนี้แทน:

 // NOTE!! THE FOLLOWING IS WRONG; DO NOT USE!  -- EleotleCram
if($("#something") !== null){
  // do something
}

หรือ

 // NOTE!! THE FOLLOWING IS WRONG; DO NOT USE!  -- EleotleCram
if($("#something") === null){
  // don't do something
}

ในขณะที่เป็นจริงการเรียกคุณสมบัติความยาวบนวัตถุที่ไม่ได้กำหนดหรือ null จะทำให้เบราว์เซอร์ล้มเหลวผลลัพธ์ของตัวเลือกของ jQuery ($ ('... ')) จะไม่เคยเป็นโมฆะหรือไม่ได้กำหนดไว้ ดังนั้นการแนะนำรหัสจึงไม่สมเหตุสมผล ใช้หนึ่งในคำตอบอื่น ๆ พวกเขามีเหตุผลมากขึ้น


(อัปเดต 2012) เนื่องจากผู้คนมองดูโค้ดและคำตอบนี้ค่อนข้างสูงในรายการ: ในช่วงสองสามปีที่ผ่านมาฉันใช้ปลั๊กอินขนาดเล็กนี้:

  jQuery.fn['any'] = function() {
     return (this.length > 0);
  };

ฉันคิดว่า$ ('div') ใด ๆ ()อ่านดีกว่า$ ('div') ความยาวรวมทั้งคุณจะไม่ได้รับความผิดพลาดมากจากการพิมพ์ผิด: $ ('div') ayn ()จะให้ข้อผิดพลาดรันไทม์ , $ ('div'). lenghtจะเงียบเกินไป

__
แก้ไขพฤศจิกายน 2012:

1) เนื่องจากผู้คนมักจะมองที่โค้ดและไม่ได้อ่านสิ่งที่ถูกกล่าวถึงในโค้ดฉันจึงได้เพิ่มคำบรรยายขนาดใหญ่สองคำในรหัสที่อ้างถึงของ Wolf
2) ฉันเพิ่มรหัสของปลั๊กอินขนาดเล็กที่ฉันใช้สำหรับสถานการณ์นี้


2
@VovaPopov: ฉันขอแนะนำครั้งต่อไปที่คุณใช้เวลาเพิ่มอีกนิดในการอ่านคำตอบ ฉันแค่บอกว่าตัวอย่างโค้ด "โดย Wolf" นั้นไม่ถูกต้อง ฉันไม่เคยให้คำตอบแค่อ้างถึงคำตอบอื่นที่เหมาะสมกว่า
eleotlecram

คำตอบที่ดี. ฉันขอโทษผู้คนตีความมันผิด
Joe Simmons

14

ฟังก์ชันการค้นหาส่งคืนอาร์เรย์ขององค์ประกอบที่ตรงกัน คุณสามารถตรวจสอบว่ามีความยาวเป็นศูนย์หรือไม่ บันทึกการเปลี่ยนแปลงเพื่อค้นหาองค์ประกอบครั้งเดียวและนำผลลัพธ์กลับมาใช้ใหม่ตามต้องการ

var elem = $("#btext" + i);
if (elem.length != 0) {
   elem.text("Branch " + i);
}

คุณเคยลองใช้ฟังก์ชั่นข้อความหรือไม่ถ้าไม่มีองค์ประกอบมันจะไม่ทำอะไรเลย

$("#btext" + i).text("Branch " + i);

7
0 เป็นค่าเท็จเพื่อประเมินการแสดงออก elem.length เท็จ - ในคำอื่น ๆ ที่มีความจำเป็นในการเป็นส่วนหนึ่ง '= 0!'
เจมส์

2
@ 999 ฉันคิดว่าการตรวจสอบกับศูนย์ทำให้โค้ดอ่านง่ายขึ้นแม้ว่าทั้งสองวิธีจะอ่านได้ง่ายสำหรับคนที่คุ้นเคยกับการเขียนสคริปต์ภาษา
แซม

12

jquery $ () ฟังก์ชั่นคืนค่าที่ไม่ใช่ศูนย์เสมอ - องค์ประกอบที่ตรงกับที่คุณเลือก cretaria หากไม่พบองค์ประกอบมันจะส่งคืนอาร์เรย์ว่าง ดังนั้นโค้ดของคุณจะเป็นแบบนี้ -

if ($("#btext" + i).length){
        //alert($("#btext" + i).text());
    $("#btext" + i).text("Branch " + i);
}

1
ฉันไม่คิดว่าเป็นความจริงที่ว่า $ () จะส่งกลับอาร์เรย์ วัตถุ jQuery มีพฤติกรรมที่คล้ายกับอาร์เรย์ แต่ฉันไม่คิดว่าพวกเขาเป็นอาร์เรย์จริงและฉันคิดว่าคุณจะพบว่าพฤติกรรมของพวกเขาไม่เหมือนกันกับอาร์เรย์ ดูการสาธิตด่วนนี้
แซม

5

ใน jQuery 1.4 คุณจะได้รับฟังก์ชั่น $. isEmptyObject แต่ถ้าคุณถูกบังคับให้ใช้ jQ เวอร์ชั่นเก่าเช่นเราผู้พัฒนา Drupal ที่น่าสงสารก็แค่ขโมยใช้รหัสนี้:

// This is a function similar to the jQuery 1.4 $.isEmptyObject.
function isObjectEmpty(obj) {
  for ( var name in obj ) {
    return false;
  }
  return true;
}

ใช้มันเหมือน:

console.log(isObjectEmpty(the_object)); // Returns true or false.

สิ่งนี้ไม่ได้ตอบคำถาม
Sam

5

ไม่ว่าคุณจะเลือกสิ่งใดฟังก์ชัน$()จะส่งคืนวัตถุ jQuery เสมอเพื่อไม่ให้ใช้ทดสอบ วิธีที่ดีที่สุด (ถ้าไม่ใช่เท่านั้น) คือการใช้size()ฟังก์ชั่นหรือคุณสมบัติความยาวดั้งเดิมตามที่อธิบายไว้ข้างต้น

if ( $('selector').size() ) {...}                   

3
if ( $('#whatever')[0] ) {...}

วัตถุ jQuery ซึ่งถูกส่งคืนโดยเมธอด jQuery ดั้งเดิมทั้งหมดไม่ใช่อาร์เรย์ แต่เป็นวัตถุที่มีคุณสมบัติมากมาย หนึ่งในนั้นคือ "ความยาว" คุณสมบัติ คุณสามารถตรวจสอบขนาด () หรือรับ (0) หรือรับ () - 'get (0)' ทำงานเหมือนกับการเข้าถึงองค์ประกอบแรกเช่น $ (elem) [0]



1

ใช้$("#selector").get(0)เพื่อตรวจสอบกับ null เช่นนั้น get ส่งคืนองค์ประกอบ dom จนกระทั่งคุณจัดการกับอาร์เรย์อีกครั้งซึ่งคุณต้องตรวจสอบคุณสมบัติความยาว โดยส่วนตัวฉันไม่ชอบการตรวจสอบความยาวสำหรับการจัดการ null มันทำให้ฉันสับสนด้วยเหตุผลบางอย่าง :)


มันน่าสนใจในวิธีที่คนอื่นคิดต่างกัน ฉันคิดว่ามันสมเหตุสมผลกว่าที่จะตรวจสอบว่าจำนวนองค์ประกอบเป็นศูนย์แทนที่จะตรวจสอบว่ามีองค์ประกอบแรกอยู่หรือไม่
แซม

1

การใช้คุณสมบัติความยาวคุณสามารถทำได้

jQuery.fn.exists = function(){return ($(this).length < 0);}
if ($(selector).exists()) { 
   //do somthing
}

2
คุณหมายถึง (this) .length> 0 หรือไม่
sage88

0

เมื่อวัตถุว่างเปล่าส่งคืนข้อผิดพลาดนี้:

Uncaught TypeError: Cannot read property '0' of null

ฉันลองใช้รหัสนี้:

try{
  if ($("#btext" + i).length) {};               
}catch(err){
  if ($("#btext" + i).length) {
     //working this code if the item, not NULL 
   }
}


-7

การโทรหาคุณสมบัติความยาวบนที่ไม่ได้กำหนดหรือวัตถุว่างเปล่าจะทำให้เบราว์เซอร์ IE และ webkit ล้มเหลว!

ลองทำสิ่งนี้แทน:

if($("#something") !== null){
  // do something
}

หรือ

if($("#something") === null){
  // don't do something
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.