2013-11-27 66 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爲所有類型的字符在那裏鍵入 - 無論是字母或數字 - 無論。