Jak sprawdzić puste obiekty w jQuery

169

Używam jQuery i chcę sprawdzić istnienie elementu na mojej stronie. Napisałem następujący kod, ale nie działa:

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

Jak sprawdzić istnienie elementu?

Prashant
źródło

Odpowiedzi:

251

Sprawdź często zadawane pytania dotyczące jQuery ...

Możesz użyć właściwości length kolekcji jQuery zwróconej przez twój selektor:

if ( $('#myDiv').length ){}
Christoph
źródło
co myślisz o var _myDiv = $ ('# myDiv'); ... .... jeśli (_myDiv.lenght) {...} tworzy wyjątek.
Nuri YILMAZ
1
jak powiedział eleotlecram; lepiej unikaj .length
numediaweb
5
@AurelianoBuendia, użyłeś lenghtzamiast length; to błąd w pisowni.
Sam
4
@numediaweb, eleotlecram nie powiedział, aby uniknąć .length.
Sam
1
ale .. czy nie pojawi się błąd „Nie można odczytać właściwości„ długość ”o wartości null”?
Sagive SEO,
61

(Ponieważ wydaje mi się, że nie mam wystarczającej reputacji, aby zagłosować za odpowiedzią ...)

Wolf napisał:

Wywołanie właściwości length w obiekcie undefined lub null spowoduje awarię przeglądarek IE i Webkit!

Zamiast tego spróbuj tego:

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

lub

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

Chociaż prawdą jest, że wywołanie właściwości length na niezdefiniowanym lub zerowym obiekcie spowoduje awarię przeglądarek, wynik selektorów jQuery ($ ('...')) nigdy nie będzie pusty ani niezdefiniowany. Dlatego sugestie dotyczące kodu nie mają sensu. Użyj jednej z pozostałych odpowiedzi, mają więcej sensu.


(Aktualizacja 2012) Ponieważ ludzie patrzą na kod, a ta odpowiedź jest dość wysoko na liście: Od kilku lat używam tej małej wtyczki:

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

Myślę, że $ ('div'). Any () czyta lepiej niż $ ('div'). Length , a ponadto nie będziesz tak bardzo cierpieć z powodu literówek: $ ('div'). Ayn () zwróci błąd w czasie wykonywania , $ ( 'div'). długość dyskretnie najprawdopodobniej zawsze być falsy.

__
Edycje listopad 2012:

1) Ponieważ ludzie mają tendencję do patrzenia na kod i nie czytania tego, co jest powiedziane wokół kodu, dodałem dwie duże uwagi lektora do zacytowanego kodu Wolfa.
2) Dodałem kod małej wtyczki, której używam w tej sytuacji.

eleotlecram
źródło
2
@VovaPopov: Sugeruję, aby następnym razem poświęcić trochę więcej czasu na przeczytanie odpowiedzi. Po prostu stwierdziłem, że przykład kodu „autorstwa Wolfa” był niepoprawny. Nigdy nie udzieliłem odpowiedzi, odniosłem się tylko do niektórych innych odpowiedzi, które mają więcej sensu.
eleotlecram
Dobra odpowiedź. Przepraszam, ludzie źle to interpretują.
Joe Simmons,
14

Funkcja wyszukiwania zwraca tablicę pasujących elementów. Możesz sprawdzić, czy długość wynosi zero. Zwróć uwagę na zmianę, aby wyszukać elementy tylko raz i ponownie wykorzystać wyniki w razie potrzeby.

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

Ponadto, czy próbowałeś po prostu użyć funkcji tekstowej - jeśli żaden element nie istnieje, nic nie da.

$("#btext" + i).text("Branch " + i);
tvanfosson
źródło
7
0 jest wartością fałszywą, więc wyrażenie elem.length przyjmuje wartość fałsz - innymi słowy, nie ma potrzeby stosowania części „! = 0”
James
2
@ 999, myślę, że sprawdzenie względem zera sprawia, że ​​kod jest bardziej czytelny, chociaż oba sposoby są prawdopodobnie czytelne dla kogoś, kto jest przyzwyczajony do języków skryptowych.
Sam
12

Funkcja jquery $ () zawsze zwraca wartość różną od null - średnie elementy dopasowane do ciebie selector cretaria. Jeśli element nie został znaleziony, zwróci pustą tablicę. Twój kod będzie więc wyglądał mniej więcej tak -

if ($("#btext" + i).length){
        //alert($("#btext" + i).text());
    $("#btext" + i).text("Branch " + i);
}
słaby
źródło
1
Myślę, że nie jest prawdą, że $ () zwraca tablicę. Obiekty jQuery zachowują się podobnie do tablic, ale nie sądzę, że są one w rzeczywistości tablicami i myślę, że zauważysz, że nie wszystkie ich zachowanie jest takie samo, jak tablic. Zobacz tę szybką demonstrację .
Sam
5

W jQuery 1.4 otrzymujesz funkcję $ .isEmptyObject, ale jeśli jesteś zmuszony używać starszej wersji jQ, jak my, biedni programiści Drupala, po prostu kradnij ten kod:

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

Używaj go jak:

console.log(isObjectEmpty(the_object)); // Returns true or false.
theamoeba
źródło
To nie odpowiada na pytanie.
Sam
5

bez względu na to, co wybierzesz, funkcja $()zawsze zwraca obiekt jQuery, więc nie można jej używać do testowania. Najlepszym sposobem (jeśli nie jedynym) jest użycie size()funkcji lub natywnej właściwości length, jak wyjaśniono powyżej.

if ( $('selector').size() ) {...}                   
spalony
źródło
3
if ( $('#whatever')[0] ) {...}

Obiekt jQuery, który jest zwracany przez wszystkie natywne metody jQuery NIE jest tablicą, lecz obiektem z wieloma właściwościami; jeden z nich jest właściwością „długości”. Możesz również sprawdzić size () lub get (0) lub get () - 'get (0)' działa tak samo jak dostęp do pierwszego elementu, czyli $ (elem) [0]

James
źródło
3

A co z używaniem „undefined”?

if (value != undefined){ // do stuff } 
Hugh Seagraves
źródło
1

użyj $("#selector").get(0)do sprawdzenia z null w ten sposób. get zwraca element dom, do tego czasu masz do czynienia z tablicą, w której musisz sprawdzić właściwość length. Osobiście nie lubię sprawdzania długości dla obsługi zerowej, z jakiegoś powodu mnie to dezorientuje :)

Emre
źródło
Interesujący jest sposób, w jaki różni ludzie myślą inaczej; Myślę, że bardziej sensowne jest sprawdzenie, czy liczba elementów wynosi zero, niż sprawdzenie, czy pierwszy element jest obecny.
Sam
1

Możesz to zrobić za pomocą właściwości length.

jQuery.fn.exists = function(){return ($(this).length < 0);}
if ($(selector).exists()) { 
   //do somthing
}
Suresh Pattu
źródło
2
Czy masz na myśli (this) .length> 0?
sage88
0

gdy obiekt jest pusty, zwraca ten błąd:

Uncaught TypeError: Cannot read property '0' of null

Próbuję tego kodu:

try{
  if ($("#btext" + i).length) {};               
}catch(err){
  if ($("#btext" + i).length) {
     //working this code if the item, not NULL 
   }
}
ahmadjn
źródło
-4
if (typeof($("#btext" + i)) == 'object'){
    $("#btext" + i).text("Branch " + i);
}
한지 만
źródło
-7

Wywołanie właściwości length w obiekcie undefined lub null spowoduje awarię przeglądarek IE i Webkit!

Zamiast tego spróbuj tego:

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

lub

if($("#something") === null){
  // don't do something
}
Wilk
źródło