jQuery: Sprawdź, czy istnieje div z pewną nazwą klasy


235

Za pomocą jQuery programowo generuję kilka divtakich:

<div class="mydivclass" id="myid1">Some Text1</div>
<div class="mydivclass" id="myid2">Some Text2</div>

Gdzie indziej w moim kodzie muszę sprawdzić, czy te DIV istnieją. Nazwa klasy dla div jest taka sama, ale ID zmienia się dla każdego div. Masz pomysł, jak je wykryć za pomocą jQuery?

Odpowiedzi:


424

Możesz to uprościć, sprawdzając pierwszy obiekt zwracany z JQuery w następujący sposób:

if ($(".mydivclass")[0]){
    // Do something if class exists
} else {
    // Do something if class does not exist
}

W takim przypadku, jeśli w pierwszym ( [0]) indeksie istnieje prawdziwa wartość , to załóżmy, że istnieje klasa.

Edytuj 04/10/2013: Utworzyłem tutaj przypadek testowy jsperf .


Dobra uwaga, w każdym razie jest to po prostu wyszukiwanie właściwości. Nie dbam o te cztery postacie, ale może to być jaśniejsze w zależności od kontekstu ...
TJ Crowder,

Skończyło się na tym rozwiązaniu, ale są też inne rozwiązania, które działają. Dziękuję za szybkie odpowiedzi.
awatar

1
Co ciekawe, można by pomyśleć, rzucając :firstna nie pomogłoby wydajność (nie wiem, czy wydajność jest ważnym kryterium @itgorilla), ale czy to nie zmienia się gwałtownie przez przeglądarkę, przypuszczalnie dlatego, że zmienia natywne funkcje jQuery można użyć, aby wykonać wybór. Oto przypadek testowy, w którym div istnieje , a tutaj taki, w którym nie istnieje .
TJ Crowder

A jeśli nie chcę wykonać kodu, jeśli klasa nie istnieje?
Thomas Sebastian

1
@ThomasSebastian Tryif (!$(".mydivclass")[0]){ /* do stuff */ }
Shaz

117

Możesz użyć size(), ale jQuery zaleca użycie długości, aby uniknąć narzutu wywołania innej funkcji:

$('div.mydivclass').length

Więc:

// since length is zero, it evaluates to false
if ($('div.mydivclass').length) {

http://api.jquery.com/size/

http://api.jquery.com/length/

AKTUALIZACJA

Wybrana odpowiedź korzysta z testu perf, ale jest nieco wadliwa, ponieważ obejmuje również wybór elementu jako część perf, co nie jest tutaj testowane. Oto zaktualizowany test perf:

http://jsperf.com/check-if-div-exists/3

Moje pierwsze uruchomienie testu pokazuje, że pobieranie właściwości jest szybsze niż pobieranie indeksu, chociaż IMO jest dość znikome. Nadal wolę używać długości, ponieważ bardziej sensowne jest przeznaczenie kodu zamiast bardziej zwięzłego warunku.


3
Zgodnie z linkiem, który podałeś do narzędzia na jsperf.com, .lengthobecnie oferuje najlepszą średnią wydajność.
gmeben,

Serwery zaspokajają moje potrzeby z najmniejszym wpływem na wydajność.
David O'Regan

77

Bez jQuery:

Natywny JavaScript zawsze będzie szybszy. W takim przypadku: (przykład)

if (document.querySelector('.mydivclass') !== null) {
    // .. it exists
}

Jeśli chcesz sprawdzić, czy element nadrzędny zawiera inny element z określoną klasą, możesz użyć jednego z poniższych. (przykład)

var parent = document.querySelector('.parent');

if (parent.querySelector('.child') !== null) {
    // .. it exists as a child
}

Alternatywnie możesz użyć .contains()metody na elemencie nadrzędnym. (przykład)

var parent = document.querySelector('.parent'),
    child = document.querySelector('.child');

if (parent.contains(child)) {
    // .. it exists as a child
}

.. i wreszcie, jeśli chcesz sprawdzić, czy dany element zawiera tylko określoną klasę, użyj:

if (el.classList.contains(className)) {
    // .. el contains the class
}

57
$('div').hasClass('mydivclass')// Returns true if the class exist.

3
To prawda, że ​​jest to alternatywa, ale droga. Będzie wolniejsze niż podejścia stosowanego we wcześniejszych odpowiedziach ( znacznie wolniej, na niektórych przeglądarkach), i mają znacznie większy wpływ pamięci, jak również (jQuery ma zbudować tablicę wszystko z divelementów na stronie, a następnie wrócić i przeglądaj je, aby sprawdzić, czy mają tę klasę, aby wyrzucić tablicę na końcu).
TJ Crowder,

3
@ tj hasClassjest o 33% szybszy niż inne selektory tutaj. Sprawdź jsperf.com/hasclass00
Hussein,

1
@Hussein: Tylko z całkowicie nierealistycznym przypadkiem testowym (dwa divelementy), który omija sam problem, który podkreśliłem (budowanie tablicy). Wypróbuj z kilkoma programami div: jsperf.com/hasclass00/2 Jest o 63% wolniej na mojej kopii Chrome, 43% wolniej na mojej kopii Firefox, 98% (!) Wolniej na Opera. Co więcej, sensowne jest , że wolniej jest budować listę div, a następnie przeszukiwać ją, niż dać silnikowi selekcji wszystkie potrzebne informacje.
TJ Crowder,

1
@Hussein: Zauważ, że byłem bardzo bezstronny i przedstawiłem zrównoważone kontr-dowody twoim twierdzeniom. Przepraszam, jeśli dotknąłem nerwu, co zdawało się, że zdarzyło się to także ostatnim razem. Po prostu zrelaksuj się, to nie jest osobisty afront, to techniczna dyskusja. Gruba skóra i otwarty umysł są przydatne w StackOverflow.
TJ Crowder,

1
@Hussein: Selektor css HTML5 oznacza, że ​​prawie zawsze będzie to najgorszy możliwy sposób. -1 za nie tylko usunięcie swojego posta.
Stefan Kendall



10

Aby divjawnie przetestować elementy:

if( $('div.mydivclass').length ){...}


Może to być nieco wolniejsze niż w .mydivclasszależności od wersji przeglądarki i jQuery.
Stefan Kendall,

To prawda, ale OP powiedział konkretnie „jQuery - sprawdź, czy istnieje div z pewną nazwą klasy ” (moje podkreślenie), więc otrzymujesz mój głos za to, że jako pierwszy faktycznie zawiera divczęść selektora.
TJ Crowder,

7

Prosty kod podano poniżej:

if ($('.mydivclass').length > 0) {
   //Things to do if class exist
}

Aby ukryć div z identyfikatorem szczegółu:

if ($('#'+given_id+'.mydivclass').length > 0) {
   //Things to do if class exist
}

3

Oto kilka sposobów:

1.  if($("div").hasClass("mydivclass")){
    //Your code

    //It returns true if any div has 'mydivclass' name. It is a based on the class name
    }

2. if($("#myid1").hasClass("mydivclass")){
    //Your code


    //  It returns true if specific div(myid1) has this class "mydivclass" name. 
    //  It is a  based on the specific div id's.
    }           
3. if($("div[class='mydivclass']").length > 0){
    //Your code

   // It returns all the divs whose class name is "mydivclass"
   //  and it's length would be greater than one.
    }

Możemy użyć dowolnego z opisanych powyżej sposobów w zależności od wymagań.


2
if ($(".mydivclass").size()){
   // code here
}

size()Metoda tylko zwraca liczbę elementów, które wybiera selektora jQuery - w tym przypadku liczbę elementów z klasy mydivclass. Jeśli zwraca 0, wyrażenie jest fałszywe, a zatem nie ma żadnej, a jeśli zwraca jakąkolwiek inną liczbę, div musi istnieć.


1
Po co wywoływać metodę, gdy istnieje lengthwłaściwość? Sprawdza to również każdy element z tą klasą, a nie tylko div. (Teraz to może oznaczać OP, nawet jeśli nie to, co powiedział). Zobacz odpowiedź Stefana Kendalla, która robi to, co OP powiedział (nawet jeśli znowu mogły oznaczać to, co zrobiłeś).
TJ Crowder,

1
@TJ Crowder: Cóż, naprawdę osobisty gust - po prostu czuję, że jest metoda size () - dlaczego jej nie użyć. Dodatkowy narzut związany z wywoływaniem funkcji (chyba, że ​​robisz to 1000 razy w pętli) jest tak minimalny, wolałbym trochę rozjaśnić kod. W drugim punkcie - tak, zmieniłem swoją pierwotną odpowiedź, aby usunąć divczęść, z dwóch powodów: 1) selektor nie jest tak ograniczony do faktu, że OP używa divelementu (może się zmienić w przyszłości), i 2) w większość przeglądarek i wersji jQuery, AFAIK, powinno to być szybsze.
Herman Schaaf,

„Po prostu czuję, że istnieje metoda size () - dlaczego jej nie użyć” Um, dobra. lengthNieruchomość jest tam, dlaczego nie korzystać? Ale jeśli to twoje preferencje, fair 'nuff. Z drugiej strony nie wiedziałem, że to zredagowałeś. Gdybym miał to zrobić, zostawiłbym to (ponownie, on konkretnie powiedział „... jeśli div z ...” (moje podkreślenie), a następnie wspomniał dodatkowo, że jeśli to nie miało znaczenia, czy to było divlub nie, można porzucić tę część. Ale cokolwiek. :-)
TJ Crowder

@TJ Crowder: Tak, myślę, że zastanawiamy się nad tym.
Herman Schaaf,

@TJ Crowder: Ale w mojej obronie, choć nie jest to miejsce na dyskusję: czuję, że size()metoda ma na celu wyjaśnienie, że liczysz liczbę elementów w selektorze jQuery, a nie tylko w jakiejkolwiek starej tablicy. Ale znowu, to tylko moje preferencje.
Herman Schaaf,

2

sprawdź, czy div istnieje z określoną klasą

if ($(".mydivclass").length > 0) //it exists 
{

}

2
if($(".myClass")[0] != undefined){
  // it exists
}else{
  // does not exist
}

2
Wydaje się prawie identyczna z tą istniejącą odpowiedzią .
Pang

Tak, tak ... ale spróbowałem tej odpowiedzi i nie zadziałało. Kiedy dodałem porównanie do „niezdefiniowanego”, wydawało się, że działa idealnie.
schodek

2
var x = document.getElementsByClassName("class name");
if (x[0]) {
alert('has');
} else {
alert('no has');
}

Chociaż ten kod może odpowiedzieć na pytanie, zapewnienie dodatkowego kontekstu dotyczącego tego, dlaczego i / lub jak ten kod odpowiada na pytanie, poprawia jego długoterminową wartość.
Vishal Chhodwani,

2

W Jquery możesz używać tego w ten sposób.

if ($(".className")[0]){

   // Do something if class exists

} else {

// Do something if class does not exist

}

Z JavaScript

if (document.getElementsByClassName("className").length > 0) {

// Do something if class exists

}else{

    // Do something if class does not exist

}

2

Oto bardzo przykładowe rozwiązanie dla klasy kontrolnej (hasClass) w JavaScript:

const mydivclass = document.querySelector('.mydivclass');
// if 'hasClass' is exist on 'mydivclass'
if(mydivclass.classList.contains('hasClass')) {
   // do something if 'hasClass' is exist.
}

1

Najlepszy sposób na Javascript:

if (document.getElementsByClassName("search-box").length > 0) {
// do something
}


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.