DIVにクラス「x」がない場合のjQuery


211

jQueryでは、ifステートメントを実行して、$ thisに '.selected'クラスが含まれていないかどうかを確認する必要があります。

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

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

});

基本的にこの機能が実行されているとき(ホバー時)、クラスに「.selected」がdivに追加されている場合はフェードを実行したくないので、選択されていることを示すために画像が完全に不透明になります。IFステートメントの使用方法についての簡単な質問ですが、Googleで検索しました。

回答:


359

「not」セレクターを使用します。

たとえば、次の代わりに:

$(".thumbs").hover()

試してください:

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


それについて考えると、OPがdocument.readyの後のある時点でクラスをdivに追加している場合、構文は機能しないと思います
Russ Cam

@ zuk1:さて、スニペットから、クラス「thumb」のすべての要素を取得し、それぞれにhover()を実行します。1つの要素の上にホバーしたいだけですか?WHatはその1つの要素ですか?私は混乱しています。
alphadogg 2009

@ラス:正解。上記を使用すると、実行時に現在DOMにあるすべての要素が取得され、「thumb」クラスで「選択」されていない要素にはhover()が実行されます。
alphadogg 2009

なんらかの理由でセレクターの外でこれを行う必要がある場合は、使用でき.not( ".selected" )、同じように機能します。素晴らしいもの。
ジョシュアピンター

180

jQueryには、ラップされたセットのいずれかの要素に指定されたクラスが含まれている場合にtrueを返すhasClass()関数があります

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

私の使用例を見てください

  • divにカーソルを合わせると、divに「選択された」クラスが含まれていない場合、divは通常の速度で100%の不透明度にフェードします。
  • divにカーソルを合わせると、divに「選択された」クラスが含まれていない場合、低速で30%の不透明度にフェードします。
  • ボタンをクリックすると、「選択された」クラスが赤いdivに追加されます。フェード効果が赤い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>

編集:

これは単なる推測ですが、このようなこと達成しようとしていますか?

  • どちらのdivも30%の不透明度で開始します
  • divの上にカーソルを合わせると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( "normal"、1.0);}、function(){$(this).stop()。fadeTo( "slow"、0.3);}});これでコード全体が壊れ、JSはどれも動作しませんそれが追加されました
zuk1

hasClassは。?hasClass( '。selected')の代わりにhasClass( 'selected')
bendewey '06

「.selected」の代わりに「selected」を使用すると、Russの例が機能する可能性がありますか?
alphadogg

謝罪、を置くことを意味していませんでした。そこで。今すぐ更新
Russ Cam

コードが機能することを示すために、いくつかの例を私の回答に追加しました
Russ Cam

28

私は著者が探していたと思います:

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

1
これが機能することを期待していませんでした。$( "。class1")。not( "。class2")のようにも機能します。これはまさに私が求めていたものです!ありがとう!
kravits88 14

3
機能しますが、配列を返すため、これはブール値としては機能しないことに注意してください。JavaScriptでは、空の配列は「真実」です。$(this).not('.selected').length本当に必要な場合はブール値として使用できますが、これは少し冗長です。
Joe Maffei

5

要素にクラスがあるかどうかを確認するときは、クラス名に誤ってドットを付けていないことを確認してください。

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

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

コードをじっと見つめているうちに、これを実行したことに気付きました。このようなタイプミスは、私が間違ったことを理解するのに1時間かかりました。コードを確認してください!


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

唯一の欠点は、選択したクラスを要素から削除した場合、ホバーイベントに再度サブスクライブする必要があることです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.