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

मेरे पास एक अपवॉट और डाउनवोट बटन है। इन बटनों के बगल में एक 'वर्तमान स्कोर' दिखाया गया है, जब वोट डालने पर मैं वृद्धि/कमी करना चाहता हूं।जावास्क्रिप्ट में एक अपवॉट/डाउनवोट सिस्टम को कार्यान्वित करना लेकिन गणित को सही नहीं मिला

उदाहरण के लिए, यदि वे पृष्ठ लोड करते हैं और स्कोर 200 देखते हैं। जब वे ऊपर चढ़ते हैं, तो स्कोर 201 में बदल जाएगा। जब वे डाउनवोट करते हैं, तो स्कोर को 199 में बदलना होगा। क्यूं कर? क्योंकि अगर वे ऊपर उठने के बाद डाउनवोट करते हैं (उनके दिमाग को बदलते हैं) तो वोट को मूल स्कोर से जाना होगा। अपवॉटिंग द्वारा बनाए गए नए स्कोर नहीं।

असल में, यदि वे ऊपर हटते हैं और फिर डाउनवोट करते हैं, तो स्कोर वर्तमान में मूल स्कोर पर वापस जाता है। उनका वोट नहीं डाला गया है।

मैं मुसीबत यह काम कर रही है ताकि मतदान है हो रही है ...

+0

प्रश्न में कोड के लिए बहुत बहुत धन्यवाद। मैं अब भी ऐसा कुछ करने की कोशिश कर रहा हूं, लेकिन मैं jQuery के साथ इतना अनुभवी नहीं हूं और सही तत्वों का चयन नहीं कर सका। – 11684

उत्तर

0

जहां तक ​​मेरा बता सकते हैं, इस उम्मीद के रूप में काम कर रहा है। यदि आप ऊपर उठते हैं, तो वह +1 है। यदि आप नीचे घटाते हैं (कमी) यह शून्य से एक है, और एन + 1 - 1 का परिणाम एन होना चाहिए। यदि वे एक असली डाउनवोट प्राप्त करना चाहते हैं तो उन्हें फिर से नीचे हटना होगा।

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) और फिर वे नीचे तीर पर क्लिक करें, आप वोट = 0 के बजाय वोट = -1 चाहते हैं (जैसे स्टैक ओवरव्लो इसे करता है)।

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; 

... वहाँ वास्तव में जोड़ने/बिल्कुल घटाकर की आवश्यकता नहीं है के बाद से।

संबंधित मुद्दे