2010-11-04 5 views
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); 
} 

У меня есть кнопка upvote и downvote. Рядом с этими кнопками отображается «текущая оценка», которую я хотел бы увеличить/уменьшить при подаче голоса.Внедрение системы upvote/downvote в Javascript, но не получается получить правильную математику

Например, еслигрузка этой страницы завершена, тактильно отобразиться 200. Когда они будут повышены, оценка изменится на 201. Когда они понижают, оценка должна быть изменена на 199. Зачем? Потому что, если они понижают уровень после выживания (передумают), тогда голосование должно идти от первоначальной оценки. Не новый балл, который они создали путем выживания.

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

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

+0

Большое спасибо за код в вопросе. Я тоже пытаюсь реализовать что-то подобное, но я не очень разбираюсь в jQuery и не могу выбрать правильные элементы. – 11684

ответ

0

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

3

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

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

к этому:

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

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

+0

Это сработало. Приветствия. – dave

+1

@dave Если это сработало, вы должны принять этот ответ. – 11684

0

Похоже, что если пользователь уже проголосовал (так что голосует = 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; 

Или, конечно, если это на самом деле либо «вверх» или «вниз» (вроде так), он получает много проще:

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

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

... так как там на самом деле нет необходимости для добавления/удаления на всех.