我正在实现一个计时器,并试图找出为什么当在输入"秒"框中输入大于60的数字时,我不能更改"min"输入框的内容。当我打印"mins"的值时,我会得到NaN,但当我打印它的类型时,我得到的是一个数字。我刚开始学习JavaScript,如果有任何帮助,我将不胜感激。谢谢:)
jQuery:
$(function(){
$("#sec").change(function(){
if($("#sec").val() >= 60){
secs = parseInt( $("#sec").val() );
console.log("secs is " + secs );
if(secs < 0){
alert("Please enter a valid time interval");
$("#sec").val("");
return;
}
mins = parseInt( $("#min").val() );
console.log("mins is " + mins );
console.log(typeof mins);
hours = parseInt( $("#hour").val() );
days = parseInt( $("#day").val() );
secs = secs % 60;
mins = mins + Math.floor(secs/60);//can be > 60
console.log("mins is " + mins );
console.log(typeof mins);
hours += mins/60;
days += hours/24;
$("#min").val(mins);
$("#hour").val(hours + mins/60);
$("#day").val(days + hours/24);
}
});
});
html:
div class="left"></div>
<div class="center">
<h3> Please enter a time: </h3>
<form class="form-inline">
<div class="form-group col-xs-2">
<input id="day" class="form-control input-sm input" type="number" value="" name="Days" placeholder="Days">
</div>
<div class="form-group col-xs-2">
<input id="hour" class="form-control input-sm input" type="number" value="" name="Days" placeholder="Hours">
</div>
<div class="form-group col-xs-2">
<input id="min" class="form-control input-sm input" type="number" value="" name="Days" placeholder="Minutes">
</div>
<div class="form-group col-xs-2">
<input id="sec" class="form-control input-sm input" type="number" value="" name="Days" placeholder="Seconds">
</div>
尽管名称"不是数字",但typeof NaN
就是"number"
。是的,真的。:-)NaN
和Infinity
一样,属于数字类型。它是为IEEE-754中的数字定义的(JavaScript和许多其他编程语言使用的浮点数格式;特别是,JavaScript使用现在所称的"二进制64子格式",也就是"双精度")。
如果您对无法解析的内容调用parseInt
,它将返回NaN
。例如:
var n = parseInt("");
console.log(typeof n); // "number"
console.log(n); // "NaN"
如果你想在mins
(等)为空时使用0
,你可以使用JavaScript功能强大得出奇的||
操作符:
mins = parseInt( $("#min").val() ) || 0;
这将为您提供返回的编号parseInt
,如果parseInt
返回0
或NaN
,则为0
。
旁注:
如果要使用
parseInt
进行用户生成的输入解析,您可能需要使用它的第二个参数,该参数告诉它要使用的基数(10,表示十进制)。例如,n = parseInt(str, 10)
。否则,它会尝试根据输入进行猜测(大多数情况下,它将以0x
开头的字符串视为十六进制)。parseInt
很乐意忽略数字后面的额外字符。例如CCD_ 19给了我们CCD_ 20。如果您不想要这种行为,可以使用+
(n = +str;
)或Number
(n = Number(str)
),这两种方法都考虑整个字符串。但它们都接受0x
在开头表示十六进制,并且不支持使用基数。