jQuery Якщо DIV не має класу "x"


211

У jQuery мені потрібно зробити оператор if, щоб побачити, чи $ цей не містить класу '.selected'.

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

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

});

В основному, коли ця функція виконується (на наведення курсора), я не хочу виконувати вимкнення, якщо клас ".selected" був доданий до div, це означає, що зображення буде повністю непрозорим, щоб означати, що його вибрано. У пошуках Google не пощастило, хоча це просто питання про те, як використовувати оператор IF ...

Відповіді:


359

Використовуйте перемикач "не ".

Наприклад, замість:

$(".thumbs").hover()

спробуйте:

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


думаючи про це, якщо ОП додає клас до діви в якийсь момент після документу. тоді я не думаю, що ваш синтаксис спрацює
— Russ Cam

@ zuk1: З вашого фрагмента ви берете всі елементи класу 'thumb' і виконуєте наведення курсора () на кожен. Ти кажеш, що хочеш просто навести курсор на один елемент? ЩО це один елемент? Я збентежений.
— альфадог

@Russ: Правильно. Якщо ви користуєтесь вищезазначеним, то він займе всі елеми, що знаходяться в DOM на момент його виконання, а для тих, у кого клас "великий палець" і не "вибраний", він набере курсор ().
— альфадог

Якщо вам потрібно зробити це поза селектором з якихось причин, ви можете скористатися, .not( ".selected" )і він буде працювати так само. Блискучі речі.
— Джошуа Пінтер

180

jQuery має функцію hasClass (), яка повертає істину, якщо будь-який елемент у загорнутому наборі містить вказаний клас

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

Погляньте на мій приклад використання

  • Якщо навести курсор миші на діву, він втрачається як звичайна швидкість до 100% непрозорості, якщо div не містить класу "вибраний"
  • Якщо ви наведіть курсор на діва, він зникає на повільній швидкості до 30% непрозорості, якщо div не містить класу "вибраний"
  • Натискання на кнопку додає клас "вибраний" до червоного дива. Ефекти завмирання більше не діють на червоний дів

Ось код для цього

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

Редагувати:

це лише здогадка, але ви намагаєтесь досягти чогось подібного ?

  • Обидва діви починаються з непрозорості 30%
  • Наведення курсора на діву зменшує непрозорість на 100%, наведення курсора повертається до непрозорості до 30%. Ефекти відцвітання працюють лише на елементах, у яких немає обраного класу
  • При натисканні на div додає / видаляє 'вибраний' клас

Код jQuery тут-

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

не працює чомусь :( $ (". thumbs"). hover (function () {if (! ($ (this) .hasClass (". selected")) {$ (this) .stop (). fadeTo ("нормальний", 1.0);}, функція () {$ (це). стоп (). fadeTo ("повільний", 0,3);}}), і він порушує весь мій код, жоден з JS не працює що додано
— zuk1

чи вимагає hasClass.? hasClass ('вибраний') замість hasClass ('. selected')
— bendewey

Приклад Russ може працювати, якщо ви використовуєте "selected" замість ".selected"?
— альфадог

вибачення, не означав ставити. там. Оновлено зараз
— Russ Cam

Я додав кілька прикладів до своєї відповіді, щоб показати код працює
— Russ Cam

28

Я думаю, що автор шукав:

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

1
Не очікував, що це спрацює. Навіть працює на зразок $ (". Class1"). Not (". Class2"), що саме те, про що я пішов! Дякую!
— kravits88

3
Це працює, але варто зазначити, що це не працює як булева, оскільки повертає масив. Порожні масиви "триє" в JavaScript. Ви можете використовувати $(this).not('.selected').lengthяк булевий, якщо дуже хотіли, але це трохи дослівно.
— Джо Маффей

5

Перевіряючи, чи є у елемента клас чи немає, переконайтеся, що ви випадково не поставили крапку у назві класу:

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

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

Після довгого погляду на свій код я зрозумів, що зробив це. На такий маленький друкарський помилок пішла година, щоб зрозуміти, що я зробив не так. Перевір свій код!


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

Якщо розмістити курсор if всередині кожної частини наведення курсору, ви зможете динамічно змінювати клас вибору, і наведення курсора все ще працюватиме.

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

Як приклад, я також додав обробник кліків, щоб переключити вибраний клас на елемент, на який натиснули. Тоді я запускаю подію наведення на попередній елемент, щоб зникнути.


0

Ви також можете використовувати методи addClass і removeClass для перемикання між елементами, такими як вкладки.

напр

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

чому б не просто використовувати toggleClass ()?
— Russ Cam

1
Тому що в елементі можуть бути інші класи.
— Тавані

0

Як щодо того, замість того, щоб використовувати if, якщо всередині події, ви відв'язуєте подію, коли застосовується клас select? Я здогадуюсь, що ви десь додаєте клас всередині свого коду, тому розв’язування події там виглядатиме так:

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

Єдиний мінус полягає в тому, що якщо ви коли-небудь видалите вибраний клас з елемента, вам доведеться підписати його на подію наведення курсору ще раз.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.