Jak mogę sprawdzić istnienie elementu w jQuery?
Obecny kod, który mam, to:
if ($(selector).length > 0) {
// Do something
}
Czy istnieje bardziej elegancki sposób na to? Być może wtyczka lub funkcja?
javascript
jquery
Jake McGraw
źródło
źródło
NaN != false
.[] + []
=""
... ahh Uwielbiam javascript[].toString() === [].join(',') === ""
i"" === ""
.typeof NaN == 'number'
Tak!
Jest to odpowiedź na: podcast Herding Code z Jeffem Atwoodem
źródło
$.fn.exists
przykład jest zastąpienie własności odnośnika (tanio!) Z dwoma wywołań funkcji, które są znacznie droższe, a jeden z tych wywołań funkcji odtwarza obiekt jQuery, które już masz, co jest po prostu głupie..exists
czyta się czysto, podczas gdy.length
czyta się jako coś semantycznie odmiennego, nawet jeśli semantyka pokrywa się z identycznym wynikiem.Jeśli używałeś
sugerowałbyś, że tworzenie łańcuchów było możliwe, gdy tak nie jest.
Byłoby lepiej:
Alternatywnie z FAQ :
Możesz również skorzystać z poniższych. Jeśli w tablicy obiektów jQuery nie ma żadnych wartości, uzyskanie pierwszego elementu w tablicy zwróci niezdefiniowane.
źródło
$(".missing").css("color", "red")
już robi właściwą rzecz… (tj. nic)$.fn
metod jQuery , które zwracają coś innego niż nowy obiekt jQuery i dlatego nie łączą łańcuchów.Możesz użyć tego:
źródło
Najszybszym i najbardziej semantycznie samo wyjaśniającym sposobem sprawdzenia istnienia jest użycie zwykłego
JavaScript
:Trochę dłużej trwa pisanie niż alternatywa jQuery, ale działa szybciej, ponieważ jest to natywna metoda JS.
I to jest lepsze niż alternatywa pisania własnej
jQuery
funkcji. Ta alternatywa jest wolniejsza z powodów podanych przez @snover. Ale dałoby to również innym programistom wrażenie, żeexists()
funkcja jest nieodłączną częścią jQuery.JavaScript
będą / powinny być rozumiane przez innych, którzy edytują Twój kod, bez zwiększonego zadłużenia z wiedzy.Uwaga: zauważ brak „#” przed
element_id
(ponieważ jest to zwykły JS, niejQuery
).źródło
$('#foo a.special')
. I może zwrócić więcej niż jeden element.getElementById
nie mogę do tego podejść.if(document.querySelector("#foo a.special"))
będzie działać. Nie wymaga jQuery.Możesz zapisać kilka bajtów, pisząc:
Działa to, ponieważ każdy obiekt jQuery również podszywa się pod tablicę, więc możemy użyć operatora dereferencji tablicy, aby uzyskać pierwszy element z tablicy . Zwraca,
undefined
jeśli nie ma pozycji o podanym indeksie.źródło
jQuery.first()
lubjQuery.eq(0)
oba zwracają obiekty, obiekty są prawdziwe, nawet jeśli są puste. Ten przykład powinien zilustrować, dlaczego tych funkcji nie można używaćif(jQuery("#does-not-exist").eq(0)) alert("#does-not-exist exists")
.eq(0)
zwraca tylko kolejny obiekt jQuery obcięty do długości 1 lub 0..first()
To tylko wygodna metoda.eq(0)
. Ale.get(0)
zwraca pierwszy element DOM lubundefined
jest taki sam jak[0]
. Pierwszy element DOM w obiekcie jQuery jest przechowywany we właściwości zwykłego obiektu o nazwie'0'
. To prosty dostęp do nieruchomości. Jedyny typ rzutowania wynika z niejawnej konwersji liczby0
na ciąg'0'
. Jeśli więc rzutowanie tekstu jest problemem, możesz$.find(selector)['0']
zamiast tego użyć .Możesz użyć:
Może trochę bardziej elegancki.
źródło
666
prawdopodobnie mają wiele innych powodów, dla których ich kod jest uszkodzony. Chociaż jest to niepoprawny selektor, $ (666) .length jest prawidłowym skryptem javascript : ocenia na prawdę i dlatego powinien spełniać warunek.$.find(666).length
działa.Wtyczki tej można użyć w
if
instrukcji takiej jakif ($(ele).exist()) { /* DO WORK */ }
lub przy użyciu wywołania zwrotnego.Podłącz
jsFiddle
Możesz określić jeden lub dwa połączenia zwrotne. Pierwszy uruchomi się, jeśli element istnieje, drugi uruchomi się, jeśli element nie istnieje. Jeśli jednak wybierzesz przekazanie tylko jednej funkcji, zadziała ona tylko wtedy, gdy element istnieje. Zatem łańcuch umrze, jeśli wybrany element nie istnieje. Oczywiście, jeśli istnieje, uruchomi się pierwsza funkcja i łańcuch będzie kontynuowany.
Pamiętaj, że użycie wariantu wywołania zwrotnego pomaga utrzymać łańcuchowość - element jest zwracany i możesz kontynuować tworzenie łańcuchów poleceń jak w przypadku każdej innej metody jQuery!
Przykładowe zastosowania
źródło
Has Items
faktycznie przekazać obiektu jako argumentu?Widzę, że większość odpowiedzi tutaj nie jest dokładna, jak powinny, sprawdzają długość elementu, w wielu przypadkach może być OK , ale nie 100% , wyobraź sobie, że zamiast tego liczba przechodzi do funkcji, więc prototypuję funkcję, która sprawdza wszystkie warunki i zwróć odpowiedź tak, jak powinna:
Spowoduje to sprawdzenie zarówno długości, jak i typu. Teraz możesz to sprawdzić w ten sposób:
źródło
Tak naprawdę nie ma potrzeby korzystania z jQuery. Dzięki zwykłemu JavaScriptowi łatwiej i semantycznie poprawne jest sprawdzenie:
Jeśli z jakiegoś powodu nie chcesz wstawiać identyfikatora do elementu, nadal możesz użyć dowolnej innej metody JavaScript zaprojektowanej w celu uzyskania dostępu do DOM.
jQuery jest naprawdę fajny, ale nie pozwól, aby czysty JavaScript popadł w zapomnienie ...
źródło
:has()
?Możesz użyć tego:
źródło
Powodem, dla którego wszystkie poprzednie odpowiedzi wymagają tego
.length
parametru, jest to, że najczęściej używają$()
selektora jquery, który ma querySelectorAll za zasłonami (lub używają go bezpośrednio). Ta metoda jest raczej powolna, ponieważ musi przeanalizować całe drzewo DOM w poszukiwaniu wszystkich dopasowań do tego selektora i zapełnić je tablicą.Parametr [„długość”] nie jest potrzebny ani przydatny, a kod będzie znacznie szybszy, jeśli użyjesz go bezpośrednio
document.querySelector(selector)
, ponieważ zwraca pierwszy zgodny element lub null, jeśli nie zostanie znaleziony.Jednak ta metoda pozostawia nam zwracany obiekt; co jest w porządku, jeśli nie będzie zapisywane jako zmienne i używane wielokrotnie (w ten sposób zachowamy odniesienie, jeśli zapomnimy).
W niektórych przypadkach może to być pożądane. Można go użyć w pętli for:
Jeśli tak naprawdę nie potrzebujesz tego elementu i chcesz uzyskać / zapisać tylko wartość prawda / fałsz, po prostu nie podwój! Działa z butami, które nie są rozwiązywane, więc po co tu węzeł?
źródło
Czy
$.contains()
chceszźródło
Stwierdziłem,
if ($(selector).length) {}
że jest niewystarczający. Cicho zepsuje Twoją aplikację, gdyselector
jest pustym obiektem{}
.Moją jedyną propozycją jest wykonanie dodatkowej kontroli
{}
.Wciąż szukam lepszego rozwiązania, ponieważ jest ono trochę ciężkie.
Edycja: OSTRZEŻENIE! To nie działa w IE, gdy
selector
jest ciągiem.źródło
$()
z pustym obiektem jako argumentem?{}
do$()
?Możesz sprawdzić, czy element jest obecny lub nie używa długości w skrypcie Java. Jeśli długość jest większa od zera, wówczas element jest obecny, jeśli długość wynosi zero, wówczas element nie jest obecny
źródło
Sprawdzanie istnienia elementu jest starannie udokumentowane na oficjalnej stronie jQuery!
źródło
jest to bardzo podobne do wszystkich odpowiedzi, ale dlaczego nie użyć
!
operatora dwa razy, aby uzyskać wartość logiczną:źródło
Boolean(x)
może być bardziej wydajny.źródło
if
gdyif
poprawi czytelność kosztem 2 bajty.&&
za Ciebie.Spróbuj przetestować dla
DOM
elementuźródło
Zainspirowany odpowiedzią hiway wymyśliłem:
jQuery.contains pobiera dwa elementy DOM i sprawdza, czy pierwszy zawiera drugi.
Użycie
document.documentElement
jako pierwszego argumentu spełnia semantykęexists
metody, gdy chcemy ją zastosować wyłącznie w celu sprawdzenia istnienia elementu w bieżącym dokumencie.Poniżej umieściłem razem fragment, który porównuje
jQuery.exists()
przeciwko$(sel)[0]
i$(sel).length
podejść, które zwracajątruthy
wartości$(4)
podczas$(4).exists()
powrotówfalse
. W kontekście sprawdzania istnienia elementu w DOM wydaje się to pożądanym rezultatem .Pokaż fragment kodu
źródło
Brak potrzeby jQuery (podstawowe rozwiązanie)
Znacznie bardziej wydajna opcja poniżej (zauważ brak kropki przed klasą).
querySelector używa odpowiedniego silnika dopasowującego, takiego jak $ () (skwierczenie) w jQuery i zużywa więcej mocy obliczeniowej, ale w 99% przypadków da sobie radę. Druga opcja jest bardziej wyraźna i mówi kodowi, co dokładnie zrobić. Jest znacznie szybszy według jsperf https://jsperf.com/getelementsbyclassname-vs-queryselectorall/25
źródło
Po prostu lubię używać do tego zwykłego javascript waniliowego.
źródło
Natknąłem się na to pytanie i chciałbym udostępnić fragment kodu, którego obecnie używam:
A teraz mogę napisać taki kod -
Może wydawać się dużo kodu, ale napisany w CoffeeScript jest dość mały:
źródło
Miałem przypadek, w którym chciałem sprawdzić, czy jakiś obiekt istnieje w innym, więc dodałem coś do pierwszej odpowiedzi, aby sprawdzić selektor wewnątrz selektora.
źródło
Co powiesz na:
Jest to bardzo minimalne i oszczędza konieczności
$()
każdorazowego zamykania selektora .źródło
if($("#thing").exists(){}
brzmi jak. Poza tym nie jest to jQuery.Używam tego:
Wykonaj łańcuch tylko wtedy, gdy istnieje element jQuery - http://jsfiddle.net/andres_314/vbNM3/2/
źródło
Oto moja ulubiona
exist
metoda w jQueryoraz inna wersja obsługująca oddzwanianie, gdy selektor nie istnieje
Przykład:
źródło
$("selector"
) zwraca obiekt, który malength
właściwość. Jeśli selektor znajdzie jakieś elementy, zostaną one uwzględnione w obiekcie. Jeśli więc sprawdzisz jego długość, zobaczysz, czy istnieją jakieś elementy. W JavaScript0 == false
, więc jeśli nie dostaniesz0
kodu, uruchomi się.źródło
Oto kompletny przykład różnych sytuacji i sposobu sprawdzenia, czy element istnieje przy użyciu direct, jeśli na jQuery selektor może działać lub nie, ponieważ zwraca tablicę lub elementy.
OSTATECZNE ROZWIĄZANIE
źródło
Nie musisz sprawdzać, czy jest większy niż
0
podoba$(selector).length > 0
,$(selector).length
wystarczy i jest to elegancki sposób na sprawdzenie istnienia elementów. Nie sądzę, że warto napisać funkcję tylko do tego, jeśli chcesz zrobić więcej dodatkowych rzeczy, tak.źródło