5
var $arrow       = $(this);
var $sibling     = $arrow.siblings('span.arrow');
var $score       = $arrow.siblings('span.score');

var vote         = $arrow.hasClass('up') ? 'up' : 'down';
var alreadyVoted = $sibling.hasClass('voted');

if (!USER_LOGGED_IN)
{
    alert('You must be logged into vote');
}
else if (!$arrow.hasClass('voted'))
{
    if (alreadyVoted)
        $sibling.removeClass('voted');

    $arrow.addClass('voted');
    $score[0].innerHTML = parseInt($score[0].innerHTML) + ((vote == 'up') ? 1 : -1);
}

賛成票と反対票のボタンがあります。これらのボタンの横に「現在のスコア」が表示され、投票時に増減させたいと思います。

たとえば、ページを読み込んでスコアが200. 彼らが賛成票を投じると、スコアは に変わり201ます。彼らが反対票を投じると、スコアを に変更する必要があります199。なんで?賛成票を投じた後に反対票を投じた場合 (気が変わった場合)、元のスコアから投票する必要があるためです。彼らがアップ投票によって作成した新しいスコアではありません。

基本的に、彼らが賛成票を投じてから反対票を投じると、現在、スコアは元のスコアに戻ります。彼らの投票は行われません。

私はこの仕事をするのに苦労しているので、彼らの投票が行われます...

4

3 に答える 3

3

このビットを変更します。

parseInt($score[0].innerHTML) + ((vote == 'up') ? 1 : -1);

これに:

parseInt($score[0].innerHTML) + ((vote == 'up') ? 1 : -1) + ((alreadyVoted) ? ((vote == 'up') ? 1 : -1) : 0);

冗長ですが、ピンチで機能します。

于 2010-11-04T12:36:02.270 に答える
0

ユーザーがすでに投票している場合(つまりvote = 1)、代わりに下矢印をクリックする場合は、vote=0ではなくvote=-1にする必要があります(StackOverflowが行うのと同じです)。その場合は、スクリプトでその状態を明示的に検出する必要があります。たとえば、次のようになります。

var voteValue = parseInt($score[0].innerHTML, 10);
if (alreadyVoted) {
    $sibling.removeClass('voted');
    // Undo the previous vote
    voteValue += $sibling.hasClass('up') ? -1 : 1;
}

// Apply the new vote
$arrow.addClass('voted');
voteValue += (vote == 'up') ? 1 : -1;
$score[0].innerHTML = voteValue;

または、もちろん、それが実際に「上」または「下」のいずれかである場合(SOのように)、はるかに単純になります。

if (alreadyVoted)
    $sibling.removeClass('voted');

$arrow.addClass('voted');
$score[0].innerHTML = vote == 'up' ? 1 : -1;

...実際には加算/減算の必要がまったくないためです。

于 2010-11-04T12:38:57.170 に答える
0

私が知る限り、これは期待どおりに機能しています。賛成すると+1です。次に反対票を投じる(減分する)と、マイナス 1 になり、n + 1 - 1 の結果は n になるはずです。真の反対票を獲得したい場合は、再度反対票を投じる必要があります。

于 2010-11-04T12:32:23.743 に答える