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。为什么?因为如果他们在upvoting(改变主意)后投反对票,那么投票需要从原始分数开始。不是他们通过投票创造的新分数。

基本上,如果他们先投赞成票,然后再投反对票,则当前的分数会回到原始分数。他们的票没有投。

我无法完成这项工作,所以他们投票...

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 = -1 而不是 vote = 0(就像 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。如果您随后投票(递减)它是负一,并且 n + 1 - 1 的结果应该是 n。如果他们想获得真正的反对票,他们应该不得不再次反对。

于 2010-11-04T12:32:23.743 回答