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.