我有2个按钮,这2个按钮会增加总点击次数。 (总数是单独计算) 用户只允许选择其中一个,这意味着用户之前是否曾点击过buttonA并再次单击buttonB。 ButtonA将 - 1和ButtonB将为+ 1.
我有以下代码,但有问题。如果在按钮之前没有点击
buttonA (0) - buttonB (0).
如果用户点击按钮,则假设为buttonA (1) - buttonB (0)
但以下代码显示
buttonA (1) - buttonB (-1)
我想要的是,按钮只会减少用户之前点击它的按钮。 我怎样才能改进我的代码?看起来很乱。
$this.addClass('active').siblings().removeClass('active');
if ($this.is('span[name="ans_yes"]')) {
yes_no = 1;
currentVal = parseInt($this.find('.badge').html());
$this.find('.badge').html(currentVal + 1);
currentVal2 = parseInt($id.find('.ans-no').html());
$id.find('.ans-no').html(currentVal2 - 1);
} else {
yes_no = 0;
currentVal = parseInt($this.find('.badge').html());
$this.find('.badge').html(currentVal + 1);
currentVal2 = parseInt($id.find('.ans-yes').html());
console.log(currentVal2);
$id.find('.ans-yes').html(currentVal2 - 1);
}
已更新 - demo
答案 0 :(得分:1)
我试图保持你的HTML结构非常相似,但我完全没有使用JS。如果有必要,您需要重新安装active
课程,因为没有任何CSS我不确定它们被用于什么(如果有的话)
var answered = {};
$('.ans-yes-no').on('click', function(e) {
var questionId = $(this).parent().attr('id');
var currentAnswer = answered[questionId];
var count = parseInt($(this).children('.badge').html());
if ( currentAnswer == $(this).attr('name') ) {
// Turning off
$(this).children('.badge').html(count-1);
delete answered[questionId];
} else {
// If we have a different answer, turn that off
if ( currentAnswer ) {
var oldCountEl = $("#"+questionId).children("span[name="+currentAnswer+"]").children('.badge');
var oldCount = parseInt(oldCountEl.html());
oldCountEl.html( oldCount - 1 );
}
// Turning on
$(this).children('.badge').html(count+1);
answered[questionId] = $(this).attr('name');
}
});
使用buttonA和buttonB的多个实例在http://jsfiddle.net/TtkDG/3/处进行演示。
编辑:要清楚,我确实必须将按钮包含在带有问题标识符的包含div中。请确保你不要错过。
答案 1 :(得分:0)
我建议使用变量didtheuserclick
,它在开头是假的,检查变量是否为真,否则忽略减法部分,并在单击函数结束时将变量设置为true,我做了一个演示,http://jsfiddle.net/TtkDG/1/
你也可以使用一个简单的整数变量,每次点击都有增量,并检查变量是否等于1,它是相同的逻辑,但如果使用它只是为了增加变量是没有意义的,特别是如果你要去达到很高的数字。
希望它有所帮助!答案 2 :(得分:0)
我创建了一个单独的函数来切换badge
的值。如果increment小于零,则打印为零。
另外请注意,为元素添加另一个类比使用name
$('.ans-yes-no').on('click', function (e) {
e.preventDefault();
var $this = $(this),
$otherBtn = $this.siblings('.ans-yes-no');
var $btnWrap = $this.closest('.topic-footer');
/* check if user has already selected, test "active" class length*/
var alreadyVoted = $btnWrap.find('.active').length;
if (alreadyVoted) {
if ($this.is('.active')) {
/* do nothing if already active?? */
return;
} else {
$this.add($otherBtn).toggleClass('active');
}
} else {
$this.addClass('active');
}
toggleValue($this, 'up');
toggleValue($otherBtn, 'down');
});
function toggleValue($element, direction) {
$element.find('.badge').text(function (i, currVal) {
var value = parseInt(currVal, 10);
direction == 'up' ? value++ : value--;
return value > -1 ? value : 0;
})
}
DEMO:http://jsfiddle.net/MZyxW/
如果用户能够继续添加,或者如果用户已经使用active
类加载html每个页面加载,那么你不想100%清楚你想要什么行为