jQuery Jeśli DIV nie ma klasy „x”


211

W jQuery muszę wykonać instrukcję if, aby zobaczyć, czy $ nie zawiera klasy „.selected”.

$(".thumbs").hover(function(){

$(this).stop().fadeTo("normal", 1.0);
},function(){
$(this).stop().fadeTo("slow", 0.3);

});

Zasadniczo, gdy ta funkcja jest uruchomiona (po najechaniu myszą) nie chcę wykonywać przenikania, jeśli klasa „.selected” została dołączona do div, będzie to oznaczać, że obraz będzie miał pełne krycie, co oznacza, że ​​jest wybrany. Szukałem w Google bez powodzenia, chociaż jest to proste pytanie, jak używać instrukcji IF ...

Odpowiedzi:


359

Użyj „nie selektora ”.

Na przykład zamiast:

$(".thumbs").hover()

próbować:

$(".thumbs:not(.selected)").hover()


myśląc o tym, jeśli OP dodaje klasę do div w pewnym momencie po dokumencie. już nie sądzę, że twoja składnia zadziała
Russ Cam

@ zuk1: Cóż, we fragmencie bierzesz wszystkie elementy za pomocą klasy „thumb” i wykonujesz hover () na każdym z nich. Mówisz, że chcesz po prostu najechać kursorem na jeden element? Co to za jeden element? Jestem zdezorientowany.
alphadogg

@Russ: Poprawnie. Jeśli użyjesz powyższego, to weźmie on wszystkie elementy znajdujące się obecnie w DOM w momencie jego wykonania, a dla tych z klasą „kciuk”, a nie „zaznaczony”, wykona hover ().
alphadogg

Jeśli z jakiegoś powodu musisz to zrobić poza selektorem, możesz go użyć .not( ".selected" )i będzie działać tak samo. Genialne rzeczy.
Joshua Pinter,

180

jQuery ma funkcję hasClass (), która zwraca true, jeśli dowolny element w zawiniętym zestawie zawiera określoną klasę

if (!$(this).hasClass("selected")) {
    //do stuff
}

Spójrz na mój przykład użycia

  • Jeśli najedziesz kursorem na div, jego normalna prędkość spada do 100% krycia, jeśli div nie zawiera „wybranej” klasy
  • Jeśli unosisz się nad divem, zanika on przy niskiej prędkości do 30% krycia, jeśli div nie zawiera klasy „wybranej”
  • Kliknięcie przycisku dodaje klasę „wybraną” do czerwonego diva. Efekty zanikania nie działają już na czerwony div

Oto jego kod

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js"></script>
<title>Sandbox</title>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<style type="text/css" media="screen">
body { background-color: #FFF; font: 16px Helvetica, Arial; color: #000; }
</style>


<!-- jQuery code here -->
<script type="text/javascript">
$(function() {

$('#myButton').click(function(e) {
$('#div2').addClass('selected');
});

$('.thumbs').bind('click',function(e) { alert('You clicked ' + e.target.id ); } );

$('.thumbs').hover(fadeItIn, fadeItOut);


});

function fadeItIn(e) {
if (!$(e.target).hasClass('selected')) 
 { 
    $(e.target).fadeTo('normal', 1.0); 
  } 
}

function fadeItOut(e) { 
  if (!$(e.target).hasClass('selected'))
  { 
    $(e.target).fadeTo('slow', 0.3); 
 } 
}
</script>


</head>
<body>
<div id="div1" class="thumbs" style=" background-color: #0f0; margin: 10px; padding: 10px; width: 100px; height: 50px; clear: both;"> 
One div with a thumbs class
</div>
<div id="div2" class="thumbs" style=" background-color: #f00; margin: 10px; padding: 10px; width: 100px; height: 50px; clear: both;">
Another one with a thumbs class
</div>
<input type="button" id="myButton" value="add 'selected' class to red div" />
</body>
</html>

EDYTOWAĆ:

to tylko przypuszczenie, ale czy próbujesz osiągnąć coś takiego ?

  • Oba divy zaczynają od 30% krycia
  • Najechanie kursorem na div zmienia się na 100% krycia, a najechanie zanika do 30% krycia. Efekty przenikania działają tylko na elementach, które nie mają klasy „wybranej”
  • Kliknięcie div dodaje / usuwa „wybraną” klasę

Kod jQuery jest tutaj-

$(function() {

$('.thumbs').bind('click',function(e) { $(e.target).toggleClass('selected'); } );
$('.thumbs').hover(fadeItIn, fadeItOut);
$('.thumbs').css('opacity', 0.3);

});

function fadeItIn(e) {
if (!$(e.target).hasClass('selected')) 
 { 
    $(e.target).fadeTo('normal', 1.0); 
  } 
}

function fadeItOut(e) { 
  if (!$(e.target).hasClass('selected'))
  { 
    $(e.target).fadeTo('slow', 0.3); 
 } 
}

<div id="div1" class="thumbs" style=" background-color: #0f0; margin: 10px; padding: 10px; width: 100px; height: 50px; clear: both; cursor:pointer;"> 
One div with a thumbs class
</div>
<div id="div2" class="thumbs" style=" background-color: #f00; margin: 10px; padding: 10px; width: 100px; height: 50px; clear: both; cursor:pointer;">
Another one with a thumbs class
</div>

z jakiegoś powodu nie działa :( $ (". thumbs"). hover (function () {if (! ($ (this) .hasClass (". selected")) {$ (this) .stop (). fadeTo ("normal", 1.0);}, function () {$ (this) .stop (). fadeTo ("slow", 0.3);}}); i psuje cały mój kod, żaden z JS nie działa z który dodał
zuk1

czy hasClass wymaga.? hasClass ('selected') zamiast hasClass ('. selected')
bendewey

Przykład Russa może działać, jeśli użyjesz „zaznaczone” zamiast „.selected”?
alphadogg

przepraszam, nie chciałem powiedzieć. tam. Zaktualizowano teraz
Russ Cam

Dodałem kilka przykładów do mojej odpowiedzi, aby pokazać działający kod
Russ Cam

28

Myślę, że autor szukał:

$(this).not('.selected')

1
Nie spodziewałem się, że to zadziała. Działa nawet jak $ („. Class1”). Not („. Class2”), co jest dokładnie tym, czego szukałem! Dzięki!
kravits88

3
Działa, ale warto zauważyć, że nie działa to jako wartość logiczna, ponieważ zwraca tablicę. Puste tablice w JavaScript są „prawdą”. Możesz użyć $(this).not('.selected').lengthlogicznej wartości, jeśli naprawdę tego chcesz, ale to trochę gadatliwe.
Joe Maffei,

5

Podczas sprawdzania, czy element ma lub nie ma klasy, upewnij się, że przypadkowo nie wstawiłeś kropki w nazwie klasy:

<div class="className"></div>

$('div').hasClass('className');
$('div').hasClass('.className'); #will not work!!!!

Po długim czasie wpatrywania się w mój kod zrozumiałem, że to zrobiłem. Taka literówka zajęła mi godzinę, żeby dowiedzieć się, co zrobiłem źle. Sprawdź swój kod!


1
$(".thumbs").hover(
    function(){
        if (!$(this).hasClass("selected")) {
            $(this).stop().fadeTo("normal", 1.0);
        }
    },
    function(){
        if (!$(this).hasClass("selected")) {
            $(this).stop().fadeTo("slow", 0.3); 
        }           
    }
);

Umieszczenie znaku „if” w każdej części aktywowania pozwoli ci dynamicznie zmienić wybraną klasę, a aktywowanie będzie nadal działać.

$(".thumbs").click(function() {
    $(".thumbs").each(function () {
        if ($(this).hasClass("selected")) {
            $(this).removeClass("selected");
            $(this).hover();
        }
    });                 
    $(this).addClass("selected");                   
});

Jako przykład podłączyłem również moduł obsługi kliknięć, aby przełączyć wybraną klasę na kliknięty element. Następnie uruchamiam zdarzenie aktywowania na poprzednim elemencie, aby zniknęło.


0

Możesz także używać metod addClass i removeClass do przełączania między elementami, takimi jak karty.

na przykład

if($(element).hasClass("selected"))
   $(element).removeClass("selected");

dlaczego nie użyć po prostu toggleClass ()?
Russ Cam

1
Ponieważ element może mieć inne klasy.
Tawani

0

Co powiesz na to, aby zamiast używać if w wydarzeniu, cofniesz powiązanie ze zdarzeniem po zastosowaniu wybranej klasy? Domyślam się, że gdzieś dodajesz klasę do swojego kodu, więc rozpięcie zdarzenia będzie wyglądało tak:

$(element).addClass( 'selected' ).unbind( 'hover' );

Jedynym minusem jest to, że jeśli kiedykolwiek usuniesz wybraną klasę z elementu, musisz ponownie zasubskrybować ją do zdarzenia hover.

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.