Bagaimana saya bisa mendeteksi jika pemilih mengembalikan nol?

271

Apa cara terbaik untuk mendeteksi jika pemilih-jQuery mengembalikan objek kosong. Jika kamu melakukan:

alert($('#notAnElement'));

Anda mendapatkan [Objek objek], jadi cara saya melakukannya sekarang adalah:

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

yang akan menulis "tidak terdefinisi", sehingga Anda dapat melakukan pemeriksaan untuk itu. Tapi sepertinya sangat buruk. Ada cara lain apa?

peirix
sumber

Jawaban:

494

Favorit saya adalah memperluas jQuery dengan kenyamanan kecil ini:

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

Digunakan seperti:

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

Lebih eksplisit daripada menggunakan panjang.

Magnar
sumber
2
Mengapa Anda memasukkan 'ini' di dalam $ ()? tidakkah 'ini' dalam konteks ini sebenarnya menunjuk ke objek jQuery?
Adham Atta
1
Saya menemukan bahwa kembali thisjauh lebih bermanfaat daripada true. Lihat jawaban saya presencemetode porting Rails ' .
Marc-André Lafortune
5
Jika Anda ingin mempertahankan kemampuan berantai, jika fungsi tersebut mengembalikan true, atau jika Anda ingin menggunakan metode ini untuk menetapkan thiske variabel, saya akan merekomendasikan mengubah pernyataan kembali ke apa yang dimiliki CSharp .
Hanna
1
Magnar, bisa tolong jelaskan bagaimana fungsi "ekstensi" ini bekerja? Saya berasumsi itu adalah konsep Javascript dan bukan konsep JQuery ketat. Saya melihat prototipe tetapi saya tidak yakin apakah itu berlaku di sini dan mengapa sintaksinya adalah "$ .fn."
KyleM
3
@ Adam Ya. Tetapi dalam hal ini, Anda hanya harus membuang cek-ada, mengingat cara kerja jQuery. Itu tidak akan melakukan sesuatu jika tidak ada elemen yang cocok dengan pemilih.
Magnar
197
if ( $("#anid").length ) {
  alert("element(s) found")
} 
else {
  alert("nothing found")
}
duckyflip
sumber
67

Selector mengembalikan array objek jQuery. Jika tidak ada elemen yang cocok ditemukan, itu mengembalikan array kosong. Anda dapat memeriksa .lengthkoleksi yang dikembalikan oleh pemilih atau memeriksa apakah elemen array pertama 'tidak terdefinisi'.

Anda dapat menggunakan salah satu contoh berikut dalam sebuah pernyataan IF dan mereka semua menghasilkan hasil yang sama. Benar, jika pemilih menemukan elemen yang cocok, salah jika sebaliknya.

$('#notAnElement').length > 0
$('#notAnElement').get(0) !== undefined
$('#notAnElement')[0] !== undefined
Jose Basilio
sumber
1
Saya menggunakan .lengthkecuali kodenya panas. Tentunya yang paling jelas dengan niat. Juga, .size()sudah usang dan telah bertahun-tahun (sejak 1.8). Saya hanya akan mengedit jawaban Anda dan menghapusnya, jangan ragu untuk menambahkannya kembali dengan catatan tetapi sudah sangat tua, saya pikir itu lebih baik hilang.
Evan Carroll
1
Secara teknis ia mengembalikan objek jQuery yang tidak mengandung node DOM. Mengatakan itu mengembalikan array kosong tidak benar.
Vigrant
39

Saya suka melakukan sesuatu seperti ini:

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

Jadi, Anda dapat melakukan sesuatu seperti ini:

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/

CSharp
sumber
6
@ Ehsan Sebenarnya itu bukan duplikat dari jawaban yang diterima ... perhatikan bahwa jawaban yang diterima hanya mengembalikan benar / salah sementara jawaban ini mengembalikan objek asli ("ini") atau salah. Jawaban ini memungkinkan Anda untuk melakukan hal-hal tambahan dengan nilai pengembalian (seperti penambahan fungsi tambahan) jika tidak salah.
RSW
1
Saya memiliki kode yang persis sama di toolkit standar saya. Formulir ini setara dengan object.presence di Rails dan sangat berguna dalam konstruk fallthrough yang dijelaskan oleh @CSharp.
inopinatus
Ini adalah jawaban yang baik, tetapi akan sangat membantu jika Anda menjelaskan apa yang terjadi jika TIDAK ada elemen yang diuji. Jawaban singkat: TypeError: firstExistingElement.doSomething is not a function. Anda dapat membungkus seluruh penugasan variabel / tes dalam if () dan hanya melakukan sesuatu jika elemen ditemukan ....
Stephen
9

Saya suka menggunakan presence, terinspirasi dari Ruby on Rails :

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

Contoh Anda menjadi:

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

Saya merasa lebih unggul daripada yang diusulkan $.fn.existskarena Anda masih dapat menggunakan operator boolean atau if, tetapi hasil yang sebenarnya lebih bermanfaat. Contoh lain:

$ul = $elem.find('ul').presence() || $('<ul class="foo">').appendTo($elem)
$ul.append('...')
Marc-André Lafortune
sumber
7

Preferensi saya, dan saya tidak tahu mengapa ini belum ada di jQuery:

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

Digunakan seperti ini:

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

Atau, seperti yang terlihat di CoffeeScript:

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

Anda mungkin ingin melakukan ini sepanjang waktu secara default. Saya telah berjuang untuk membungkus fungsi jquery atau metode jquery.fn.init untuk melakukan ini tanpa kesalahan, tetapi Anda dapat membuat perubahan sederhana ke sumber jquery untuk melakukan ini. Termasuk beberapa garis di sekitarnya yang dapat Anda cari. Saya sarankan mencari sumber jqueryThe 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 = {

Terakhir, Anda dapat memperoleh kode sumber jquery yang tidak terkompresi di sini: http://code.jquery.com/

Devin G Rhode
sumber