Внедрение системы голосов за/против в Javascript, но не могу правильно рассчитать

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. Почему? Потому что, если они проголосовали против после того, как проголосовали за (передумали), тогда голосование должно исходить из исходной оценки. Не новый счет, который они создали путем голосования.

По сути, если они проголосуют за, а затем проголосуют против, оценка в настоящее время возвращается к исходной оценке. Их голос не подается.

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


person dave    schedule 04.11.2010    source источник
comment
Большое спасибо за код в вопросе. Я сейчас тоже пытаюсь реализовать что-то подобное, но я не очень разбираюсь в jQuery и не могу выбрать нужные элементы.   -  person 11684    schedule 05.05.2013


Ответы (3)


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

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

к этому:

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

Это многословно, но это сработает в крайнем случае.

person Stephen    schedule 04.11.2010

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

person Robusto    schedule 04.11.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;

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

person T.J. Crowder    schedule 04.11.2010