【问题标题】:isNaN isn't working properlyisNaN 无法正常工作
【发布时间】:2013-11-27 04:38:36
【问题描述】:

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

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

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

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

【问题讨论】:

  • 事件应该是onkeypress 而不是onKeyPress;
  • @ThankYouSRT — 它似乎是一个内联侦听器,因此属性名称不区分大小写,任何大小写都可以。

标签: javascript html


【解决方案1】:

将特殊情况的行为与isNaN() 混淆

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

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

【讨论】:

  • 抱歉,但这种解释与操作描述的情况完全无关,与 isNaN 行为完全无关。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    你的代码

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

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

    由于您正在全局访问事件对象,但它不存在[!],-此声明

    String.fromCharCode(event.keyCode)

    要么触发错误;要么或 Firefox 做出妥协,即当调用未定义的“事件”关键字的属性时,返回 undefined 测试的值

    isNaN(undefined);

    总是评估为 true

    这就是为什么您在此处输入的各种字符(无论是字母还是数字)都得到 true

    【讨论】:

      猜你喜欢
      • 2017-09-08
      • 2016-12-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-01
      • 2012-07-11
      • 2018-04-08
      • 2017-04-20
      • 2018-10-02
      相关资源
      最近更新 更多