ฉันจะตรวจสอบได้อย่างไรว่าตัวเลือกคืนค่าเป็นศูนย์หรือไม่


271

เป็นวิธีที่ดีที่สุดในการตรวจสอบว่า jQuery-selector ส่งกลับวัตถุว่างเปล่า ถ้าคุณทำ:

alert($('#notAnElement'));

คุณได้รับ [วัตถุวัตถุ] ดังนั้นวิธีที่ฉันทำตอนนี้คือ:

alert($('#notAnElement').get(0));

ซึ่งจะเขียน "undefined" และคุณสามารถตรวจสอบได้ แต่มันดูแย่มาก มีวิธีอื่นอีกไหม?

คำตอบ:


494

สิ่งที่ฉันชอบคือการขยาย jQuery ด้วยความสะดวกสบายเล็ก ๆ นี้:

$.fn.exists = function () {
    return this.length !== 0;
}

ใช้เหมือน:

$("#notAnElement").exists();

ชัดเจนกว่าการใช้ความยาว


2
ทำไมคุณถึงใส่คำว่า 'นี่' ไว้ใน $ () จะไม่ 'นี้' ในบริบทนี้จริงชี้ไปที่วัตถุ jQuery?
Adham Atta

1
ผมพบว่ากลับมาจะเป็นประโยชน์มากกว่าthis trueดูคำตอบของฉันในการย้ายpresenceวิธีของ Rails
Marc-André Lafortune

5
ถ้าคุณต้องการรักษาความสามารถในการโยงฟังก์ชันควรส่งคืนจริงหรือถ้าคุณต้องการใช้วิธีนี้เพื่อกำหนดให้thisกับตัวแปรฉันอยากจะแนะนำให้เปลี่ยนคำสั่ง return เป็นสิ่งที่ CSharpมี
ฮันนา

1
Magnar คุณช่วยอธิบายว่าฟังก์ชั่น "ส่วนขยาย" นี้ใช้งานได้จริงได้อย่างไร? ฉันถือว่าเป็นแนวคิดของ Javascript และไม่ใช่แนวคิดของ JQuery อย่างเคร่งครัด ฉันดูต้นแบบแล้ว แต่ฉันไม่แน่ใจว่าจะใช้ที่นี่และทำไมไวยากรณ์จะเป็น "$ .fn"
KyleM

3
@ อดัมใช่ แต่ในกรณีนี้คุณควรปล่อยการตรวจสอบที่มีอยู่ให้ jQuery ทำงานอย่างไร มันจะไม่ทำอะไรเลยถ้าไม่มีองค์ประกอบที่ตรงกับตัวเลือก
Magnar


67

ตัวเลือกส่งคืนอาร์เรย์ของวัตถุ jQuery หากไม่พบองค์ประกอบที่ตรงกันมันจะส่งคืนอาร์เรย์ว่าง คุณสามารถตรวจสอบ.lengthคอลเลกชันที่ส่งคืนโดยตัวเลือกหรือตรวจสอบว่าองค์ประกอบอาร์เรย์แรกเป็น 'ไม่ได้กำหนด'

คุณสามารถใช้ใด ๆตัวอย่างต่อไปนี้ภายในคำสั่ง IF และพวกเขาทั้งหมดผลผลิตผลเดียวกัน จริงถ้าตัวเลือกพบองค์ประกอบที่ตรงกัน, เท็จเป็นอย่างอื่น

$('#notAnElement').length > 0
$('#notAnElement').get(0) !== undefined
$('#notAnElement')[0] !== undefined

1
ฉันใช้.lengthยกเว้นว่ารหัสร้อน ชัดเจนที่สุดด้วยความตั้งใจ นอกจากนี้ยัง.size()เลิกใช้งานมานานหลายปีแล้ว (ตั้งแต่ 1.8) ฉันแค่จะแก้ไขคำตอบของคุณแล้วลบออกรู้สึกอิสระที่จะเพิ่มมันกลับมาพร้อมกับโน้ต แต่มันเก่ามากฉันคิดว่ามันหายไปดีกว่า
Evan Carroll

1
ในทางเทคนิคแล้วมันจะส่งคืนวัตถุ jQuery ที่ไม่มีโหนด DOM การบอกว่าคืนอาร์เรย์ว่างเปล่าไม่ถูกต้อง
Vigrant

39

ฉันชอบทำสิ่งนี้:

$.fn.exists = function(){
    return this.length > 0 ? this : false;
}

ดังนั้นคุณสามารถทำสิ่งนี้:

var firstExistingElement = 
    $('#iDontExist').exists() ||      //<-returns false;
    $('#iExist').exists() ||          //<-gets assigned to the variable 
    $('#iExistAsWell').exists();      //<-never runs

firstExistingElement.doSomething();   //<-executes on #iExist

http://jsfiddle.net/vhbSG/


6
@Ehsan จริงๆแล้วมันไม่ใช่คำตอบที่ได้รับการยอมรับซ้ำ ... โปรดทราบว่าคำตอบที่ยอมรับนั้นจะส่งกลับจริง / เท็จเท่านั้นในขณะที่คำตอบนี้จะส่งกลับวัตถุต้นฉบับ ("นี่") หรือเท็จ คำตอบนี้ช่วยให้คุณสามารถทำสิ่งเพิ่มเติมด้วยค่าส่งคืน (เช่นการผูกมัดฟังก์ชันเพิ่มเติม) หากไม่ใช่แบบเท็จ
RSW

1
ฉันมีรหัสเดียวกันในชุดเครื่องมือมาตรฐานของฉัน แบบฟอร์มนี้เทียบเท่ากับ object.presence ใน Rails และมีประโยชน์อย่างยิ่งในการสร้างทางเลือกที่ @CSharp อธิบาย
inopinatus

นี่เป็นคำตอบที่ดี แต่มันจะมีประโยชน์ถ้าคุณอธิบายว่าจะเกิดอะไรขึ้นถ้าไม่มีองค์ประกอบของการทดสอบที่มีอยู่ คำตอบสั้น ๆ : TypeError: firstExistingElement.doSomething is not a function. คุณสามารถสรุปการกำหนด / ทดสอบตัวแปรทั้งหมดใน if () และทำบางสิ่งหากพบว่าองค์ประกอบนั้นอยู่ในนั้น ...
Stephen R

9

ฉันชอบที่จะใช้presenceแรงบันดาลใจจากRuby on Rails :

$.fn.presence = function () {
    return this.length !== 0 && this;
}

ตัวอย่างของคุณจะกลายเป็น:

alert($('#notAnElement').presence() || "No object found");

ฉันคิดว่ามันเหนือกว่าข้อเสนอ$.fn.existsเพราะคุณยังสามารถใช้โอเปอเรเตอร์บูลีนifได้ แต่ผลลัพธ์ที่เป็นความจริงนั้นมีประโยชน์มากกว่า ตัวอย่างอื่น:

$ul = $elem.find('ul').presence() || $('<ul class="foo">').appendTo($elem)
$ul.append('...')

7

การตั้งค่าของฉันและฉันไม่รู้ว่าทำไมสิ่งนี้ไม่ได้อยู่ใน jQuery:

$.fn.orElse = function(elseFunction) {
  if (!this.length) {
    elseFunction();
  }
};

ใช้แบบนี้:

$('#notAnElement').each(function () {
  alert("Wrong, it is an element")
}).orElse(function() {
  alert("Yup, it's not an element")
});

หรือตามที่ปรากฏใน CoffeeScript:

$('#notAnElement').each ->
  alert "Wrong, it is an element"; return
.orElse ->
  alert "Yup, it's not an element"


0

คุณอาจต้องการทำสิ่งนี้ตลอดเวลาโดยค่าเริ่มต้น ฉันพยายามที่จะห่อฟังก์ชั่น jquery หรือวิธี jquery.fn.init ให้ทำโดยไม่มีข้อผิดพลาด แต่คุณสามารถทำการเปลี่ยนแปลงอย่างง่าย ๆ กับแหล่ง jquery เพื่อทำสิ่งนี้ รวมแล้วคือเส้นรอบ ๆ ที่คุณสามารถค้นหาได้ ฉันแนะนำให้ค้นหาแหล่งข้อมูล jquery สำหรับThe jQuery object is actually just the init constructor 'enhanced'

var
  version = "3.3.1",

  // Define a local copy of jQuery
  jQuery = function( selector, context ) {

    // The jQuery object is actually just the init constructor 'enhanced'
    // Need init if jQuery is called (just allow error to be thrown if not included)
    var result = new jQuery.fn.init( selector, context );
    if ( result.length === 0 ) {
      if (window.console && console.warn && context !== 'failsafe') {
        if (selector != null) {
          console.warn(
            new Error('$(\''+selector+'\') selected nothing. Do $(sel, "failsafe") to silence warning. Context:'+context)
          );
        }
      }
    }
    return result;
  },

  // Support: Android <=4.0 only
  // Make sure we trim BOM and NBSP
  rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;

jQuery.fn = jQuery.prototype = {

สุดท้าย แต่ไม่ท้ายสุดคุณสามารถรับซอร์สโค้ด jquery ที่ไม่มีการบีบอัดได้ที่นี่: http://code.jquery.com/

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