Jquery 使用-1进行求值加法无效

Jquery 使用-1进行求值加法无效,jquery,eval,Jquery,Eval,我的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').addClas

我的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次用于向下投票、取消向上投票和向上投票。它工作得很好,除了一个例外,如果truc.html是-1,那么它将转到-11而不是0

知道它为什么不起作用吗?你们可以在这里试试:id:azerty pw:azerty

试着解析,不要先将值求值为整数:

truc.html( parseInt( truc.html(), 10 ) + 1 );
请记住,+还在JavaScript中执行字符串连接。如果您有一个字符串“1”,并向其中添加一个1的整数,则会生成一个字符串“11”

首先将字符串解析为整数,然后执行数学运算,得到预期的结果。

不要将eval用于此类工作!在Javascript中使用parseInt、Number…,或其他多种将值转换为数字的方法

truc.html(parseInt(truc.html(), 10) + 1);
请注意parseInt函数中的第二个参数。这意味着您希望传入的值被解析为基数为10的数字。如果在未指定基数的情况下将以0开头的数字传入parseInt函数,则会得到意外的结果

甚至这个:

truc.html(truc.html()*1 + 1);
这是因为将字符串数字乘以一的结果会将变量转换为数字。小心-如果你乘的变量不是一个有效的数字,你会得到NaN


不能简单地执行trc.htmltruc.html+1的原因;是因为.html返回一个字符串值。如果在Javascript中向字符串添加一个数字,该数字只会连接到字符串,而不会执行任何数学运算。e、 g.-1+1等于-11。

您需要确保该值是一个整数,并且在这种情况下使用.text更好

parseInt(truc.text(), 10)+1

这个问题是因为javascript的concatentor是加号+,如果解析为字符串,a+将导致字符串连接,而不是所需的加法。请确保JS使用parseInt函数将您的truc.html解析为int,如下所示:

truc.html( parseInt( truc.html(), 10 ) + 1 );

同样也不确定你为什么要首先使用eval,Elliot已经提到了其中的问题。

:当有一个非常好的函数时,为什么要使用eval?@jamesalardice,他在加法操作后进行评估,这毫无意义。你的评论暗示eval可以在这里用parseInt替换,这也没有什么意义,这两个函数有不同的用途。@ŠimeVidas-很好。正如我认为您所假设的,我没有注意到+1也是eval参数的一部分。@ŠimeVidas:这是有道理的。parseInt12+1,10是121,eval12+1也是121。@David天宇王:这种行为与评估无关。在JavaScript中,“1”+1的计算结果为“11”,因为+运算符还执行字符串连接。在将操作数相加之前,需要将它们强制为数字类型。parseInt消除了求值的需要@Jamesalardice,很快就得到了答案。别忘了,10英寸帕西恩特-PDon不要忘记parseInt的基数参数。我建议在parseInt中添加10,以确保数字被解释为基数10。您可能还希望将+1移到parseInt之外。这仍然是-11而不是问题中的0。是的,对,我的错误。我想,这就是答案写得太快的原因。不,我编辑了我的答案,它以前是不正确的。为我的困惑道歉,我永远不会忘记我的基数@Dunhamzzz谢谢,最后一个不知怎么从我身边溜走了。
truc.html(parseInt( truc.html(), 10 ) + 1);
truc.html( parseInt( truc.html(), 10 ) + 1 );