2013-11-27 70 views
2

这是我在文本框中将输入限制为数字的属性。isNaN无法正常工作

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

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

我读的isNaN功能支持跨浏览器,但它在firefox中不能正常工作。我在这里做错了什么?

+0

事件应该是'onkeypress'而不是'onKeyPress'; –

+0

@ ThankYouSRT - 它似乎是内联监听器,因此属性名称不区分大小写,任何大小写都可以。 – RobG

回答

4

isNaN()

由于isNaN功能规范的最早的版本混乱的特殊情况下的行为,其非数值参数的行为一直扑朔迷离。当isNaN函数的参数不是Number类型时,该值首先被强制为一个Number。然后测试结果值以确定它是否为NaN。因此,对于非数字,强制为数字类型时会生成有效的非NaN数值(特别是空字符串和布尔基元,当强制数字值为零或一时),“假”返回值可能是意外的;例如,空字符串肯定“不是数字”。这种混淆源于这个术语“不是数字”,对于表示为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

+0

抱歉,但这种解释与op描述的情况完全无关,与isNaN行为完全无关。 –

0

如果你的目的是检查输入是一个数字,一个更好的方法来测试是看在输入的实际值:

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

上面是“更好”作为值可以不按任何键,从而不引起按键事件,人输入所以keyCode可能会解析为意想不到的值。你真正关心的是控制的价值,而不是它如何到达那里。

此外,请不要限制用户可以输入到控件中的内容,只需在您想要使用它的时候测试该值(例如,在表单提交时或控件失去焦点时)。用户经常会碰到不正确的密钥,并自己修正错误。在用户有机会执行操作之前,抛出错误或自动删除角色,这使得控制难以使用,并不容易。

0

您的代码

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

不会对Mozilla浏览任何版本,因为MOZ不公开事件。不管多么违反直觉,moz浏览器都需要一个带有声明参数名称的函数,比如function(e){...;在这些地方,他们任意地将事件对象分配给由事件触发的函数。

既然你在全球范围内访问事件对象,它不存在, - 这声明

String.fromCharCode(event.keyCode)

要么引发错误[!]或Firefox做出妥协,当不确定的“事件”关键字的属性被调用,返回undefined值测试

isNaN(undefined);

始终计算为真正

这就是为什么你得到true为所有类型的字符在那里键入 - 无论是字母或数字 - 无论。