我遇到了这个js代码的问题:
$('.downvoted').live('click',function(){
var ele = $(this);
var truc = ele.prev('.score_position');
$.post('ajax/vote.php', { vote :ele.attr('title') }, function(data) {
if(data == 'done'){
ele.removeClass('downvoted').addClass('downvote').html('<img src="images/down.png" />');
truc.html(eval(truc.html()+1));
}
});
return false;
});
所以我有其他3次同样的功能,用于downvoting,un-upvoting和upvoting。它运行良好,除了一个例外,如果truc.html()为-1,那么它将转到-11而不是0。
知道为什么它不起作用? (你们可以在这里试试:http://91.121.154.130/?sort=last&# id:azerty pw:azerty)
答案 0 :(得分:6)
请勿使用eval()
进行此类工作!使用parseInt
,Number(...)
或任何其他多种方法将值转换为Javascript中的数字。
truc.html(parseInt(truc.html(), 10) + 1);
注意parseInt
函数中的第二个参数。这意味着您希望将传递的值解析为基数为10的数字。如果您将一个以0开头的数字传入parseInt
函数而未指定基数,则会产生意外和不需要的结果。
或者
truc.html(Number(truc.html())+1);
甚至这个:
truc.html(truc.html()*1 + 1);
这是有效的,因为将字符串数乘以1会将变量转换为数字。请注意 - 如果您乘以的变量不是有效数字,那么您将获得NaN
!
您不能简单地执行truc.html(truc.html()+1);
的原因是因为.html()
返回字符串值。如果在Javascript中向字符串添加数字,则该数字将简单地连接到字符串,并且不执行数学运算。 (例如&#34; -1&#34; +&#34; 1&#34;等于&#34; -11&#34;)。
答案 1 :(得分:4)
首先尝试解析(永远不要使用eval
)该值为整数:
truc.html( parseInt( truc.html(), 10 ) + 1 );
请记住+
也在JavaScript中执行字符串连接。如果你有一个字符串'1',并且你添加一个1的整数,它将产生一个'11'的字符串。
首先将字符串解析为整数,然后执行数学运算,得到预期的结果。
答案 2 :(得分:2)
此问题是因为javascript的concatentor是加号+
,如果解析为字符串,+
将导致字符串连接,而不是所需的添加。修复它,确保JS使用truc.html()
函数将parseInt()
解析为int,如下所示:
truc.html( parseInt( truc.html(), 10 ) + 1 );
也不确定为什么你首先使用eval,Elliot已经触及了那里的问题..
答案 3 :(得分:1)
truc.html(parseInt( truc.html(), 10 ) + 1);
答案 4 :(得分:0)
您需要确保该值为整数,并且在这种情况下使用.text()
会更好。
parseInt(truc.text(), 10)+1