Powiedziano mi, że funkcje jquery mogą być połączone ze sobą.

Zastanawiałem się więc, czy ten kod:

if (cDiv.hasClass('step-dark-left'))
    cDiv.removeClass('step-dark-left').addClass('step-light-left');

Można to zmienić, usuwając if w następujący sposób:

cDiv.removeClass('step-dark-left').addClass('step-light-left');

Więc jeśli .removeClass się nie powiedzie, to .addClass nie zostanie wykonane?

4
Dementic 17 lipiec 2011, 12:46
Czy próbowałeś? Co się stało?
 – 
Mat
17 lipiec 2011, 12:49
Cóż, addClass został wykonany. zastanawiałem się, czy to przez pomyłkę.
 – 
Rafael Herscovici
17 lipiec 2011, 12:54

3 odpowiedzi

Najlepsza odpowiedź

removeClass() nie nie powiedzie się, jeśli element nie ujawnia step-dark-left klasa. Po prostu nic nie zrobi i zwróci obiekt jQuery, dlatego zawsze zostanie wywołane addClass().

Musisz więc zachować instrukcję if, chyba że możesz sprawdzić klasę w samym selektorze jQuery. Na przykład, jeśli Twój element <div> ma atrybut id ustawiony na cDiv:

$("#cDiv.step-dark-left").removeClass("step-dark-left")
                         .addClass("step-light-left");

W ten sposób obiekt jQuery będzie pusty, jeśli element nie uwidacznia klasy step-dark-left na początku, więc zarówno removeClass(), jak i addClass() w takim przypadku nic nie zrobią.

4
Frédéric Hamidi 17 lipiec 2011, 12:52
Tak, ale czy nie stanowiłoby to kosztów ogólnych za wyszukiwanie divów?
 – 
Rafael Herscovici
17 lipiec 2011, 12:54
— nie optymalizuj przedwcześnie. Może użycie if będzie szybsze, może użycie konkretnego selektora będzie szybsze. Zależy to od kontekstu i nie ma to znaczenia, chyba że profilowanie pokazuje, że działa zbyt wolno.
 – 
Quentin
17 lipiec 2011, 12:56
@Demencja, to zależy. Czy robisz coś innego z cDiv poza przełączaniem klas? Jeśli tak, to wywołanie hasClass() w instrukcji if jest prawdopodobnie dobrym rozwiązaniem, ponieważ w takim przypadku nie dołączysz nazwy klasy w selektorze jQuery.
 – 
Frédéric Hamidi
17 lipiec 2011, 12:59

Tak, kod, który napiszesz, będzie działał jak w pierwszym przykładzie. jQuery jest bardzo dobrze napisaną biblioteką, a wszystkie metody zawsze zwracają obiekt jquery. Zatem metoda removeClass(), jeśli nie znajdzie klasy CSS „step-dark-left”, po prostu nic nie zrobi i zwróci obiekt jquery, więc kolejna metoda w łańcuchu będzie działać.

1
Brian O'Dell 16 listopad 2011, 01:02
Nie wiem, dlaczego zostałeś odrzucony, ponieważ dokładnie wyjaśniłeś, co się dzieje. być może dlatego, że do twojej odpowiedzi nie dołączono żadnego rozwiązania.
 – 
Rafael Herscovici
17 lipiec 2011, 14:41
Szkoda, ale pytanie nie dotyczyło rozwiązania, tylko tego, jak to działa.
 – 
KSDaemon
17 lipiec 2011, 15:32
Ta odpowiedź jest wewnętrznie sprzeczna. Nie będzie działać tak, jak w pierwszym przykładzie — step-light-left zostanie dodane niezależnie od tego, czy step-dark-left został usunięty.
 – 
Quentin
17 lipiec 2011, 21:06
Pytanie brzmiało: Więc jeśli .removeClass się nie powiedzie, to .addClass nie zostanie wykonane? I nie o przykładowy kod. Może być jedynym powodem dodania instrukcji if było sprawienie, że metoda .removeClass() nie zawiedzie, więc addClass() odniesie sukces.
 – 
KSDaemon
18 lipiec 2011, 00:05

Tak, to zadziała. Jeśli nie można znaleźć step-dark-left, zostanie to zignorowane.

-2
Roger Far 17 lipiec 2011, 12:51
1
Przepraszam Rogier, ale to nieprawda, też tak myślałem, ale drugie polecenie nadal się wykonuje.
 – 
Rafael Herscovici
17 lipiec 2011, 12:55
Chciałbym :D, wypróbuj go na jsfiddler lub innym środowisku.
 – 
Rafael Herscovici
18 lipiec 2011, 01:54