在我当前的源代码文本框值为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
答案 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 question和this other question以供参考。