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

Tengo un voto positivo y un voto a favor. Un "puntaje actual" se muestra al lado de estos botones que me gustaría incrementar/disminuir cuando se lanza un voto.Implementando un sistema de voto/voto modificado en Javascript pero no puede obtener el matemático correcto

Por ejemplo, si cargan la página y ven que el puntaje es 200. Cuando voten a favor, el puntaje cambiará a 201. Cuando votan negativamente, el puntaje debe cambiar a 199. ¿Por qué? Porque si votan negativamente después de la votación ascendente (cambian de opinión), entonces la votación debe ir desde el puntaje original. No es el nuevo puntaje que crearon mediante la votación ascendente.

Básicamente, si subieron y luego bajan, el puntaje, en la actualidad, vuelve a la calificación original. Su voto no está emitido.

estoy teniendo problemas para hacer este trabajo por lo que se emitieron su voto ...

+0

Muchas gracias por el código en la pregunta. Estoy intentando implementar algo así también ahora, pero no tengo mucha experiencia con jQuery y no pude seleccionar los elementos correctos. – 11684

Respuesta

0

Por lo que yo puedo decir, esto está funcionando como se esperaba. Si votaste positivamente, eso es +1. Si luego downvote (decrementa) es menos uno, y el resultado de n + 1 - 1 debe ser n. Deberían tener que volver a votar si quieren lograr un verdadero voto negativo.

3

cambio de este bit:

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

a esto:

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

Su prolijo, pero funcionará en caso de apuro.

+0

Eso funcionó. Aclamaciones. – dave

+1

@dave Si eso funcionó, debes aceptar esta respuesta. – 11684

0

Parece que si el usuario ya votó (así que vote = 1) y luego hace clic en la flecha hacia abajo, quiere votar = -1 en vez de votar = 0 (como lo hace StackOverflow). Si es así, tendrá que detectar de forma explícita esa condición en el script, algo así como:

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; 

O, por supuesto, si realmente es o "arriba" o "abajo" (como tal), se pone mucho más simple :

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

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

... ya que en realidad no hay necesidad de suma/resta en absoluto.

Cuestiones relacionadas