Реализация upvote / downvote системы в Javascript, но не могу понять математику правильно - PullRequest
5 голосов
/ 04 ноября 2010
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. Зачем? Потому что, если они понизят после голосования (передумают), тогда голос должен идти от первоначального счета. Не новый счет, который они создали с помощью upvotting.

В основном, если они повышают, а затем понижают, счет, в настоящее время, возвращается к исходному. Их голос не отдан.

У меня проблемы с выполнением этой работы, поэтому их голос отдан ...

Ответы [ 3 ]

3 голосов
/ 04 ноября 2010

измените этот бит:

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

на это:

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

Подробно, но он будет работать в крайнем случае.

0 голосов
/ 04 ноября 2010

Похоже, что если пользователь уже проголосовал "за" (так что голосование = 1), а затем вместо этого он щелкает стрелку вниз, вы хотите голосовать = -1 вместо голоса = 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;

... так как на самом деле нет нужды добавлять / вычитать.

0 голосов
/ 04 ноября 2010

Насколько я могу сказать, это работает, как ожидалось.Если вы проголосуете, это +1.Если вы затем понизите (уменьшите), это будет минус один, и результат n + 1 - 1 должен быть nИм следует снова понизить голос, если они хотят добиться истинного отрицания.

...