私はこの賛成/反対の問題に取り組んできましたが、3つの問題が発生し続けています。
コード:
$(function() {
$('button').click(function(e){
e.preventDefault();
var $this = $(this),
$container = $(this).parent(),
$buttons = $container.children('button'),
$count = $container.children('.count'),
was = $container.data('was');
// 0 case
if ($this.is('.up')) {
if (was === 0 || $this.is('.active')) {
vote = 0;
} else {
vote = 1;
}
} else {
vote = -1;
}
if ( was + vote < 0 ) {
$this.toggleClass('active');
return false;
}
if( $this.hasClass('active') ){
$this.toggleClass('active');
$count.text( was );
} else {
if( $buttons.filter('.active').length ){
$buttons.toggleClass('active');
} else {
$this.toggleClass('active');
}
$count.text( was + vote );
}
});
});
ライブデモ:jsfiddle </ p>
デモで各ケースにラベルを付けました(合計6ケース)
問題:
ケース#1:アクティブなクラスがあり、元々(data-was)0だった場合、下をクリックするとアクティブなクラスが追加され、赤になり、カウントが0に保たれます。
ケース#2:アクティブなクラスが下ボタンにあり、元のスコアが1であった場合(データは)、アクティブなクラスは上に進み、カウントは3になります。
ケース#3:ボタンにアップクラスがあり、元のスコアが(data-was)1だった場合、下をクリックすると0になり、アクティブクラスを下に置くと、上をクリックすると0になります。アクティブなクラスを上から削除し、アクティブなクラスを下に向けて上をクリックすると、1に戻るはずです。
ケース#4〜#6はすべて正常に動作するため、問題が明確でない場合は、すべてそのように動作する必要がありますが、0を下回ることはありません。
これはやや複雑になり続けるので、ajaxリクエストから実際に返されたスコアを表示することだけを議論していますが、クリック間の待ち時間は必要ないので、この方法でアプローチしています。