2009-02-06 19 views
191

En jQuery necesito hacer una instrucción if para ver si $ this no contiene la clase '.selected'.jQuery Si DIV no tiene clase "x"

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

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

}); 

Básicamente cuando se ejecuta esta función (en vuelo estacionario) no quiero para realizar los fundidos si la clase '.selected' se ha añadido a la div, esto significará que la misma estará a pleno opacidad para indicar que está seleccionado. Buscado en Google a ninguna suerte a pesar de que se trata de una simple cuestión de cómo utilizar una instrucción IF ...

Respuesta

331

Utilice el "not "

Por ejemplo, en lugar de:.

$(".thumbs").hover()

intento:

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

+0

pensar en ello, si el OP es la adición de la clase a la div en algún momento después document.ready entonces no creo que su sintaxis trabajará –

+1

Además, hay varios div llamados .thumbs .... – zuk1

+0

@ zuk1: Bueno, desde tu fragmento, tomas todos los elementos con la clase 'thumb' y haces un hover() sobre cada uno. ¿Estás diciendo que solo quieres flotar sobre un elemento? ¿Cuál es ese elemento? Estoy confundido. – alphadogg

159

jQuery tiene la función hasClass() º por lo devuelve verdadero si cualquier elemento en el conjunto envuelto contiene la clase especificada

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

Take a look at my example of use

  • Si se pasa sobre un div, que se desvanece como velocidad normal al 100% de opacidad si el div hace no contiene el 'selected' clase
  • Si pasa de un div, que se desvanece a baja velocidad al 30% de opacidad si el div no contiene el 'selected' clase
  • Al hacer clic en el botón, se agrega la clase "seleccionada" al div rojo. El desvanecimiento efectos ya no funcionan en el div roja

Aquí está el código para ello

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

EDIT:

esto es sólo una suposición, pero estás tratando de achieve something like this ?

  • dos divs comienzan a partir de 30% de opacidad
  • pasar por encima de un div se desvanece a 100% de opacidad, vuelo estacionario sin desvanece hasta el 30% de opacidad. Se desvanecen los efectos sólo funcionan en elementos que no tienen la 'selected' clase
  • Al hacer clic en un div agrega/elimina la clase 'selected'

Código jQuery es aquí-

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

no funciona por alguna razón :( $ (" ") pulgares. Flotar (function() { if (! ($ (This) .hasClass (". Seleccionada")) {$ (esto) .Stop() fadeTo ("normal", 1,0);.. }, la función() { $ (this) .Stop() fadeTo ("lento", 0,3); } }); y rompe mi código completo, ninguno de los JS funciona con ese agregado – zuk1

+0

doesClass requiere el.? HasClass ('selected') en lugar de hasClass ('' selected ') – bendewey

+0

El ejemplo de Russ puede funcionar si usa "selected "en lugar de" .selected "? – alphadogg

0

Usted también puede usar los métodos addClass y removeClass para alternar entre elementos tales como pestañas.

p. Ej.

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

¿por qué no usar simplemente toggleClass()? –

+1

Porque el elemento podría tener otras clases. – Tawani

0

¿Qué tal en lugar de utilizar un if dentro del evento, se desvincula el caso cuando se aplica la clase selecta? supongo agregar la clase dentro de su código en algún lugar, por lo compromiso.Por el caso de que se vería así:

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

El único inconveniente es que si alguna vez se quita la clase seleccionada del elemento, hay que suscríbete al evento hover nuevamente.

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

Poner un if dentro de cada parte de la libración le permitirá cambiar la clase selecta de forma dinámica y el vuelo estacionario seguirá funcionando.

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

Como ejemplo, también he adjuntado un controlador de clics para cambiar la clase seleccionada al elemento seleccionado. Luego disparo el evento de desplazamiento sobre el elemento anterior para que se desvanezca.

2

cuando se está comprobando si un elemento tiene o no tiene una clase, asegúrese de que no accidentalmente pone un punto en el nombre de clase:

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

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

Después de mucho tiempo de mirar a mi código Me di cuenta de que había hecho esto. Un pequeño error tipográfico como este me llevó una hora descubrir qué había hecho mal. ¡Revisa tu código!

24

creo que el autor buscaba:

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

No esperaba que esto funcionara. Incluso funciona como $ (". Class1"). Not (". Class2") ¡que es exactamente lo que estaba buscando! ¡Gracias! – kravits88

+1

Funciona, pero vale la pena señalar que esto no funciona como booleano, ya que devuelve una matriz. Los arreglos vacíos son "verdaderos" en Javascript. Podría usar '$ (this) .not ('. Selected'). Length' como booleano si realmente quisiera, pero eso es un poco detallado. –

Cuestiones relacionadas