2012-03-07 13 views
2

クリック機能でクラスonを削除し、新しいクラスoffを追加しようとしています。 divを再度クリックすると、クラスonを再度追加して、クラスoffが削除されています。どのような理由でこれが機能していないのか分かりません。しかし、それが働くことを警告するなら。 ここに私のコードです。そしてJsfiddle demoクリックでJqueryスイッチのオン/オフを切り替える

$(".on").bind('click',function() { 
    $(this).removeClass('on').addClass('off'); 
    alert('Hello World'); 
}) 
$(".off").bind('click',function() { 
    $(this).removeclass('off').addClass('on'); 
    alert('Hello World'); 
}) 
​ 

答えて

6

$(".on")$(".off")は現在、セレクタに一致するDOM内の要素を選択します。したがって、要素のクラスを.onから.offに変更すると、それは要素にバインドされているので、.onイベントハンドラを起動します。あなたは、イベントの委任を使用することができますが、私は.toggleClass()はおそらくあなたのためのより高度な実装であると思う:ここ

$(".on, .off").bind('click',function() { 
    $(this).toggleClass('on off'); 
    alert('Hello World'); 
}) 

はデモです:http://jsfiddle.net/LEvM4/1/

あなたが要素の上に現在あるクラス知る必要がある場合あなたがチェックすることができます.hasClass():ここ

$(".on, .off").bind('click',function() { 
    $(this).toggleClass('on off'); 
    if ($(this).hasClass('on')) { 
     alert('Hello World'); 
    } else { 
     alert('Goodbye World'); 
    } 
}) 

はデモです:http://jsfiddle.net/LEvM4/2/

イベント委任に関する単語。また、あなたはにバインドする要素の祖先である要素に結合し、そして子孫要素にイベントハンドラを委任することができます。http://jsfiddle.net/LEvM4/3/

マイナス面へ:ここ

$(document).delegate(".on", 'click', function() { 
    $(this).addClass('off').removeClass('on'); 
    alert('Goodbye World'); 
}).delegate(".off", 'click', function() { 
    $(this).addClass('on').removeClass('off'); 
    alert('Hello World'); 
}) 

デモですイベントの委任とは、イベントが発生したときにオーバーヘッドが増えることです。可能であれば、要素に直接バインドするのが通常です。通常、要素が現在DOMに存在しないが、要素の将来のインスタンスにバインドする場合は、イベント委譲を使用します。

屋のためのいくつかのドキュメント:

+0

お返事ありがとうございました。わたしにはできる。 – Dips

+0

私は最初の解決策が好きです – Dips

+0

@ user1193749ええ、私はそれがあなたにとって最も簡単だと思います。 – Jasper

1

ライブバインディングのようなものを使用すると、コード作成がずっと簡単になります。検討する

$('.on').live('click', function() { 
    $(this).removeClass('on').addClass('off'); 
}); 
$('.off').live('click', function() { 
    $(this).removeClass('off').addClass('on'); 
}); 
+1

'.live()'は '.on()'の方が償却されていることに注意してください:http://api.jquery.com/live(jQuery 1.4.2から1.6.4まで、 '。 delegate()は '.live()'より優先されます)。 – Jasper

0

あなたはそれを確認してください。

$(".on").live('click',function() { 
    $(this).removeClass('on').addClass('off'); 
}) 
$(".off").live('click',function() { 
    $(this).removeclass('off').addClass('on'); 
}) 
+1

'.live()'は 'のために償却されます。on() ':http://api.jquery.com/live/(jQuery 1.4.2から1.6.4までを使用している場合、' .live() 'より' .delegate() 'が優先されます)。 – Jasper

関連する問題