0

想知道如何处理这个问题。我以前做过,但它涉及很多 if/else 语句,如果不诉诸于此,我似乎无法弄清楚。我在 codereview 上发布了它,并请人帮我重新考虑它,但现在我正试图让这个功能正常工作。

现在的工作原理是,如果您单击“向上”,它将增加 1 分。如果您再次单击“向上”,它会降低分数。没关系。如果您单击“向下”,它将具有相同的行为。但是它永远不会低于 0,因为我不想显示负分。

现在我只是检查上一个或下一个按钮上是否有.upColor.downColorcss 类,检查他们是否已经投票。我在尝试基于此更新正确分数时遇到问题,尤其是在原始分数为 0 或分数为 10 的情况下。

我试图实现的逻辑:

例如,原始分数为 0:

  • 用户投票。得分为 1。用户投反对票。分数变为 0(不是 -1)
  • 用户投反对票。分数保持在 0。用户投票赞成。分数变为 1。

例如,原始分数为 10:

  • 用户投票。得分为 11。用户投反对票。分数达到 9。
  • 用户投反对票。得分为 9。用户投票。分数达到 11。

代码:

$(function() {

var handleClick = function($btn) {
    var $voteContainer = $btn.parent();
    var scoreNode = $('.count');
    var originalScore = Number($voteContainer.data('original-score'));

    if ($btn.hasClass('down')) {
        if ($btn.prevAll('.up').hasClass('upColor')) {
            $btn.prevAll('.up').toggleClass('upColor');
            alert('voted up now voting down, decrease 2 points, but don\'t go below 0.');
        }
    }


    if ($btn.hasClass('up')) {
        if ($btn.nextAll('.down').hasClass('downColor')) {
            $btn.nextAll('.down').toggleClass('downColor');
            alert('voted down now voting up, increase by 2 points');
        }
    }

    var increment = $btn.hasClass('up') ? 1 : $btn.hasClass('down') && originalScore > 0 ? -1 : 0; // default

    // Only do something if there is an increment
    if (increment) {
        var currentScore = Number(scoreNode.text()) || 0;
        var newScore = currentScore + increment;
        var diff = Math.abs(originalScore - newScore);

        // Can't go more than + or - 1
        if (diff > 1) {
            newScore = originalScore;
        }

        // Set new displayed value
        scoreNode.text(newScore);
    }
    $btn.hasClass('up') ? $btn.toggleClass('upColor') : $btn.toggleClass('downColor');
};

var upBtn = $('.up');
var downBtn = $('.down');

upBtn.add(downBtn).click(function() {
    var $btn = $(this);

    handleClick($btn);
});

});

演示:http: //jsfiddle.net/3kCPw/

4

1 回答 1

0

我不会重写你的代码,因为它会花费我太长时间,但我会给你一些我从一开始就会使用的代码。

从原始编号开始:

var original_vote = 2;
var current_vote = original_vote;

保持这个常数,以备将来参考。然后,当您单击赞成票时,您可以简单地添加 1:

current_vote = original_vote + 1;

然后取消选中赞成票将使其:

current_vote = original_vote;

然后对反对票做相反的事情。

保留原始数字可确保您不会意外地使选票超出应有的范围。

希望这可以帮助!

于 2012-11-08T01:30:04.850 回答