parseInt不起作用

时间:2013-11-17 15:44:32

标签: javascript jquery

在我当前的源代码文本框值为1。 当我尝试alert(isNaN(obj.text())时,它会返回预期的false,但在我写alert(a);后的parseInt之后,它会返回NaN

minus.click(function () {
     var a = 1; if (!isNaN(obj.text())) a = parseInt(obj.text()); 
     if (a > 1) a -= 1; obj.text(a);
});

问题是什么?

编辑:这是完整的代码:

<input type="text" class="basket-txt" value="1" />


jQuery.fn.basket = function (options) {
    var defaults = {
    }
    options = jQuery.extend(defaults, options);
    this.each(function () {
        var $this = $(this);
        $this.height(32).css({ 'line-height': '32px', 'font-weight': 'bold', 'width':'40px', 'text-align':'center', });
        var tbl = $('<table border="0" style="border-spacing:0px;float:left;">').appendTo($this.parent());
        var tr1 = $('<tr>').appendTo(tbl);
        var plus = $('<div class="basket-plus">');
        $('<td>').append(plus).appendTo(tr1);
        $('<td>').append($this).appendTo(tr1);
        var minus = $('<div class="basket-minus">');
        $('<td>').append(minus).appendTo(tr1);
        var tr2 = $('<tr>').appendTo(tbl);
        $('<td>').appendTo(tr2);
        $('<td>').appendTo(tr2).append($('<div>').addClass('add-to-basket'));
        $('<td>').appendTo(tr2);
        $this.keypress(function (e) { if (e.which < 48 || e.which > 57) e.preventDefault(); });
        minus.click(function () {

            var a = 1; if (!isNaN($this.text())) a = parseInt($this.text()); 
            if (a > 1) a -= 1; $this.text(a);
        });
        plus.click(function () {
            var a = 1; if (!isNaN($this.text())) a = parseInt($this.text());
            if (a < 1000000) a += 1; $this.text(a);
        });
    });
}

实际上我知道我可以纠正代码并且它可以解决为什么isNaN返回false但是parseInt返回NaN

3 个答案:

答案 0 :(得分:5)

您获得<input> .val()而不是.text()的价值。

isNaN()函数会为false返回isNaN("")。为什么?因为当""(空字符串)转换为数字时,它是0。将非数字传递给isNaN(),它所做的第一件事就是将值强制转换为数字。

无论如何在isNaN()之前尝试parseInt()是没有意义的,因为parseInt()会告诉你什么时候它无法解析一个漂亮的整数。但请注意,parseInt()并不关心输入的 end 是否有垃圾。

如果你想将一个字符串转换为一个数字,当它是一个数字的有效字符串表示,而NaN则不是,你可以使用

var myNumber = +myString;

那也会接受带小数部分和指数的数字,所以你必须将它截断为一个整数或检查它是否是一个:

var myNumber = +myString;
if (isNaN(myNumber))
  // not a valid number
else if (myNumber !== Math.floor(myNumber))
  // not an integer
else
  // yaay!

答案 1 :(得分:4)

jQuery text()方法将获取元素的所有后代文本节点,并将它们组合成一个字符串。

input元素不能包含任何类型的后代节点。它的当前值通过value属性公开,您可以使用jQuery中的val()方法读取该属性。

如果没有基数,则不应使用parseInt,尤其是使用自由格式输入时。您可能会得到八进制或十六进制数据而不是小数。

parseInt($this.val(), 10)

答案 2 :(得分:2)

minus.click(function () {
    // let's parse the integer first
     var num = parseInt( obj.val(), 10 );

     // then later, we can check if it's NaN
     if ( !isNaN(num) && num > 1 ) {
        num -= 1;
        obj.val(num);
     }
});



  

实际上我知道我可以纠正这些代码并且它可以解决我的问题   理解为什么isNaN返回false但parseInt返回NaN

isNaN 无法正常运行。有类型强制正在进行。
isNaN 会先将值转换为数字。空字符串将转换为0

Number("") === 0; // true

0显然不是NaN,因此返回false。

parseInt 不执行类型强制,它以不同方式解析值。

检查this questionthis other question以供参考。