Bir seçicinin null değerini döndürüp döndürmediğini nasıl tespit edebilirim?


271

Bir jQuery seçici boş bir nesne döndürüp döndürmediğini algılamanın en iyi yolu nedir? Yaparsan:

alert($('#notAnElement'));

[object Object] elde edersiniz, bu yüzden şimdi bunu yapmanın yolu:

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

ki bu "undefined" yazacak ve böylece bunun için bir kontrol yapabilirsiniz. Ama çok kötü görünüyor. Başka hangi yol var?

Yanıtlar:


494

Benim favorim jQuery'yi bu küçük kolaylıkla genişletmektir:

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

Gibi kullanılır:

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

Uzunluk kullanmaktan daha açık.


2
'Bunu' neden $ () içine sardınız? Bu bağlamda 'this' aslında jQuery nesnesine işaret etmez mi?
Adham Atta

1
Dönen thisçok daha yararlı olduğunu düşünüyorum true. Rails presenceyöntemini taşıyan cevabımı görün .
Marc-André Lafortune

5
Zincirleme yeteneğini korumak istiyorsanız, işlev doğru dönerse thisveya bir değişkene atamak için bu yöntemi kullanmak isterseniz, CSharp'in sahip olduğu dönüş ifadesini değiştirmenizi öneririm .
Hanna

1
Magnar, bu "uzatma" fonksiyonunun gerçekte nasıl çalıştığını açıklayabilir misiniz? Bunun bir Javascript konsepti olduğunu ve kesinlikle bir JQuery konsepti olmadığını varsayıyorum. Prototip oluşturmaya baktım ama bunun burada geçerli olup olmadığından ve sözdiziminin neden "$ .fn" olacağından emin değilim.
KyleM

3
@Adam Evet. Ancak bu durumda, jQuery'nin nasıl çalıştığı göz önüne alındığında, varoluş kontrolünü bırakmanız gerekir. Seçiciyle eşleşen bir öğe yoksa bir şey yapmaz.
Magnar

197
if ( $("#anid").length ) {
  alert("element(s) found")
} 
else {
  alert("nothing found")
}

67

Seçici, bir jQuery nesneleri dizisi döndürür. Eşleşen öğe bulunamazsa boş bir dizi döndürür. .lengthSeçici tarafından döndürülen koleksiyonu kontrol edebilir veya ilk dizi öğesinin 'tanımsız' olup olmadığını kontrol edebilirsiniz.

Sen kullanabilirsiniz herhangi bir IF deyimi içinde aşağıdaki örnekler ve hepsi üreten aynı sonucu. Doğru, seçici eşleşen bir öğe bulduysa, aksi takdirde yanlış.

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

1
.lengthKod sıcak olmadığı sürece kullanıyorum . Kesinlikle en açık olanı bu. Ayrıca, .size()kullanımdan kaldırılmıştır ve yıllardır (1.8'den beri). Sadece cevabınızı düzenleyeceğim ve kaldıracağım, bir notla geri eklemekten çekinmeyin, ama çok eski, bence daha iyi.
Evan Carroll

1
Teknik olarak, DOM düğümü içermeyen bir jQuery nesnesi döndürür. Boş bir dizi döndürdüğünü söylemek doğru değil.
Vigrant

39

Böyle bir şey yapmayı seviyorum:

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

Böylece böyle bir şey yapabilirsiniz:

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 Aslında kabul edilen cevabın kopyası değil ... kabul edilen cevabın sadece true / false, bu cevap ya orijinal nesneyi ("this") veya false döndürdüğünü unutmayın . Bu yanıt, yanlış değilse döndürme değeriyle (ek işlev zinciri gibi) ek şeyler yapmanızı sağlar.
RSW

1
Standart araç setimde tam olarak aynı kod var. Bu form Rails'te object.presence'e eşdeğerdir ve @CSharp'ın açıkladığı düşey yapıda süper yararlıdır.
inopinatus

Bu iyi bir yanıttır, ancak test edilen öğelerin HİÇBİRİ mevcut değilse ne olacağını açıklamanız yararlı olacaktır. Kısa cevap: TypeError: firstExistingElement.doSomething is not a function. Tüm değişken atamasını / testini bir if () içine sarabilir ve yalnızca bir öğe bulunduğunda bir şeyler yapabilirsiniz ....
Stephen R

9

Kullanmayı seviyorum presence, Ruby on Rails'ten esinlenerek :

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

Örneğin:

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

$.fn.existsBoole operatörlerini kullanabileceğiniz için önerilenden daha üstün buluyorum ya ifda gerçek sonuç daha yararlı. Başka bir örnek:

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

7

Benim tercihim ve bunun neden zaten jQuery'de olduğu hakkında hiçbir fikrim yok:

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

Bunun gibi kullanılır:

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

Veya CoffeeScript'te göründüğü gibi:

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


0

Bunu varsayılan olarak her zaman yapmak isteyebilirsiniz. Bunu hatasız yapmak için jquery işlevini veya jquery.fn.init yöntemini sarmak için uğraşıyorum, ancak bunu yapmak için jquery kaynağında basit bir değişiklik yapabilirsiniz. Arama yapabileceğiniz bazı çevreleyen hatlar dahildir. İçin jquery kaynağı aramanızı öneririmThe 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 = {

Son olarak, sıkıştırılmamış jquery kaynak kodunu buradan alabilirsiniz: http://code.jquery.com/

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.