jQuery DIV "x" Sınıfına Sahip Değilse


211

JQuery $ bu '.selected' sınıfı içermiyor olmadığını görmek için bir if deyimi yapmak gerekir.

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

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

});

Temelde bu işlev çalıştırıldığında (fareyle üzerine gelindiğinde) div '.selected' sınıfı div'a eklenmişse, solmaları gerçekleştirmek istemiyorum, bu, görüntünün seçildiğini belirtmek için tam opaklıkta olacağı anlamına gelir. Bir IF deyiminin nasıl kullanılacağına dair basit bir soru olmasına rağmen Google'da hiç şanssız arama yaptım ...

Yanıtlar:


359

"Değil " seçicisini kullanın .

Örneğin:

$(".thumbs").hover()

Deneyin:

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


Bunu düşünmek, eğer OP belgeden sonra bir noktada div sınıf ekliyorsa. o zaman sözdizimin işe yarayacağını sanmıyorum
Russ Cam

@ zuk1: Snippet'inizden, tüm öğeleri 'thumb' sınıfıyla alıp her birinin üzerine bir vurgulu () yaparsınız. Bir öğenin üzerine gelmek istediğinizi mi söylüyorsunuz? Bu bir unsur nedir? Kafam karıştı.
alphadogg

@Russ: Doğru. Yukarıdakini kullanırsanız, o anda yürütülmekte olan DOM'daki tüm elemleri alacaktır ve 'seçili' olmayan 'başparmak' sınıfına sahip olanlar için fareyle üzerine gelecektir ().
alphadogg

Herhangi bir nedenden dolayı bunu seçicinin dışında yapmanız gerekirse, kullanabilirsiniz .not( ".selected" )ve aynı şekilde çalışacaktır. Harika şeyler.
Joshua Pinter

180

jQuery, sarılmış kümedeki herhangi bir öğe belirtilen sınıfı içeriyorsa true döndüren hasClass () işlevine sahiptir

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

Kullanım örneğime bir göz atın

  • Bir div'ın üzerine gelirseniz, div 'seçili' sınıfı içermiyorsa normal hız olarak% 100 opaklığa geçer
  • Bir div öğesinin dışına çıkarsanız, div 'seçili' sınıfı içermiyorsa yavaş hızda% 30 opaklığa geçer
  • Düğmeye tıklamak kırmızı div öğesine 'seçili' sınıf ekler. Solma efektleri artık kırmızı div üzerinde çalışmıyor

İşte bunun kodu

<!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>

DÜZENLE:

bu sadece bir tahmin, ama böyle bir şey elde etmeye mi çalışıyorsun ?

  • Her iki div% 30 opaklıkta başlar
  • Bir div'ın üzerine gelmek% 100 opaklığa kaybolur, dışarı çıkmak% 30 opaklığa geri döner. Solma efektleri yalnızca 'seçili' sınıfı olmayan öğelerde çalışır
  • Bir div tıklandığında 'seçilen' sınıf eklenir / kaldırılır

jQuery Kodu burada-

$(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>

herhangi bir nedenden dolayı çalışmıyor :( $ (". thumbs"). hover (function () {if (! ($ (this) .hasClass (". seçilmiş")) {$ (this) .stop (). fadeTo ("normal", 1.0);}, function () {$ (this) .stop (). fadeTo ("slow", 0.3);}}); ve tüm kodumu kırar, JS'nin hiçbiri ekledi
zuk1

hasClass. gerektirir? hasClass ('. seçilmiş') yerine hasClass ('seçildi')
bendewey

".Selected" yerine "seçilmiş" kullanırsanız Russ örneği işe yarayabilir mi?
alphadogg

özür dilerim, demek istemedim. Orada. Şimdi güncellendi
Russ Cam

Kodun çalıştığını göstermek için
cevabıma

28

Bence yazar arıyordu:

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

1
Bunun işe yaramasını beklemiyordum. Hatta $ (". Class1"). Değil (". Class2") gibi çalışır. Teşekkürler!
kravits88

3
Çalışır, ancak bir dizi döndürdüğü için bunun bir boolean olarak çalışmadığını belirtmek gerekir. Boş diziler Javascript'te "doğrudur". $(this).not('.selected').lengthGerçekten isterseniz boolean olarak kullanabilirsiniz , ama bu biraz ayrıntılı.
Joe Maffei

5

Bir öğenin sınıfa sahip olup olmadığını kontrol ederken, sınıf adına yanlışlıkla bir nokta koymadığınızdan emin olun:

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

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

Koduma uzun süre baktıktan sonra bunu yaptığımı fark ettim. Böyle küçük bir yazım hatası neyi yanlış yaptığımı anlamaya bir saatimi aldı. Kodunuzu kontrol edin!


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); 
        }           
    }
);

Fareyle üzerine gelindiğinde her bölümün içine bir if koymak, seçme sınıfını dinamik olarak değiştirmenize izin verir ve fareyle üzerine gelme yine de çalışır.

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

Örnek olarak, seçilen sınıfı tıklanan öğeye geçirmek için bir tıklama işleyicisi de ekledim. Ardından, solmasını sağlamak için önceki öğenin üzerine gelme olayını tetiklerim.


0

Sekmeler gibi öğeler arasında geçiş yapmak için addClass ve removeClass yöntemlerini de kullanabilirsiniz.

Örneğin

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

neden sadece toggleClass () kullanmıyorsunuz?
Russ Cam

1
Çünkü öğenin başka sınıfları olabilir.
Tawani

0

Etkinliğin içinde bir if kullanmak yerine, select sınıfı uygulandığında etkinliğin bağlantısını kaldırmaya ne dersiniz? Ben bir yere kodunuzu içine sınıf eklemek, bu yüzden olayı orada şuna benzeyeceğini tahmin:

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

Tek dezavantajı, seçilen sınıfı öğeden kaldırırsanız, hover olayına tekrar abone olmanız gerektiğidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.