isNaN无法正常工作

时间:2013-11-27 04:38:37

标签: javascript html

这是我在文本框中放置的属性,用于限制输入数字。

 onKeyPress="if(isNaN(String.fromCharCode(event.keyCode))) event.preventDefault();"

与谷歌浏览器完美配合。对于非数字keyPress,isNaN函数返回 true ,并为每个数字keyPress返回 false 。但是在firefox isNaN函数中,对于数字和非数字按键都返回true。

我读了isNaN函数跨浏览器支持但它在firefox中运行不正常。我在这做错了什么?

3 个答案:

答案 0 :(得分:4)

使用isNaN()

混淆特殊情况行为

由于isNaN函数规范的最早版本,其非数字参数的行为一直令人困惑。当isNaN函数的参数不是Number类型时,该值首先被强制转换为Number。然后测试得到的值以确定它是否是NaN。因此,对于非数字,当强制转换为数字类型时会产生有效的非NaN数值(特别是空字符串和布尔基元,当强制赋予数值0或1时),“false”返回值可能是意外的;例如,空字符串肯定是“不是数字”。混淆源于这样一个事实,即“非数字”一词对于表示为IEEE-794浮点值的数字具有特定含义。该函数应解释为回答问题,“当强制转换为数值时,该值是否为IEEE-794'非数字'值?”

下一版本的ECMAScript(ES6)包含函数Number.isNaN函数。 Number.isNaN(x)将是测试x是否为NaN的可靠方法。然而,即使使用Number.isNaN,NaN的含义仍然是精确的数字含义,而不仅仅是“不是数字”。或者,在没有Number.isNaN的情况下,表达式(x!= x)是一种更可靠的方法来测试变量x是否为NaN,因为结果不会受到使得isNaN不可靠的误报的影响。

<强>示例:

    isNaN(NaN);       // true
    isNaN(undefined); // true
    isNaN({});        // true

    isNaN(true);      // false
    isNaN(null);      // false
    isNaN(37);        // false

    // strings
    isNaN("37");      // false: "37" is converted to the number 37 which is not NaN
    isNaN("37.37");   // false: "37.37" is converted to the number 37.37 which is not NaN
    isNaN("");        // false: the empty string is converted to 0 which is not NaN
    isNaN(" ");       // false: a string with spaces is converted to 0 which is not NaN

    // This is a false positive and the reason why isNaN is not entirely reliable
    isNaN("blabla")   // true: "blabla" is converted to a number. Parsing this as a number fails and returns NaN

参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isNaN

答案 1 :(得分:0)

如果您打算检查输入是否为数字,更好的测试方法是查看输入的实际值:

onblur="if (/\D/.test(this.value)) alert('there\'s a non-digit in the value');"

以上是“更好”,因为可以在不按任何键的情况下输入值,从而不会导致按键事件,keyCode也可以解析为意外值。你真正关心的只是控制的价值,而不是它是如何到达的。

另外,请不要限制用户可以在控件中键入的内容,只需在您想要使用它时测试值(例如,在表单提交时或控件失去焦点时)。用户通常会敲错键并愉快地自行修复错误。在用户有机会进行操作之前自动抛出错误或删除角色会使控件更难使用,而不是更容易。

答案 2 :(得分:0)

您的代码

onKeyPress="if(isNaN(String.fromCharCode(event.keyCode))) event.preventDefault();"

不适用于任何版本的Mozilla浏览器,因为moz不会公开事件。无论多么违反直觉,moz浏览器都需要一个具有声明参数名称的函数,比如函数(e){...;他们在事件触发的函数上任意分配事件对象。

由于您正在全局访问事件对象,并且它没有[!], - 此声明

String.fromCharCode(event.keyCode)

会触发错误;或Firefox做出妥协,当一个未定义的事件&#39;已调用关键字,以返回测试

undefined

isNaN(undefined);

始终评估为 true

这就是为什么你要输入 true 来输入所有类型的字符 - 无论是字母还是数字 - 无论如何。

相关问题