[英]isNaN isn't working properly
這是我放置在文本框上的屬性,用於將輸入限制為數字。
onKeyPress="if(isNaN(String.fromCharCode(event.keyCode))) event.preventDefault();"
與Google Chrome完美搭配。 isNaN函數返回true用於非數字按鍵,並為每一個數字按鍵返回false。 但是在Firefox中,isNaN函數對於數字和非數字按鍵都返回true。
我閱讀了支持跨瀏覽器的isNaN函數,但是在Firefox中效果不佳。 我在這里做錯了什么?
與isNaN()
混淆特殊情況的行為
由於isNaN函數規范的最早版本,其對非數字參數的行為一直令人困惑。 當isNaN函數的參數不是Number類型時,該值首先被強制為Number。 然后測試結果值以確定它是否為NaN。 因此,對於非數字,當將其強制轉換為數字類型時會導致產生有效的非NaN數值(尤其是空字符串和布爾基元,當它們被強制數字為零或一時),返回的“ 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/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/isNaN
如果您要檢查輸入是否為數字,則更好的測試方法是查看輸入的實際值:
onblur="if (/\D/.test(this.value)) alert('there\'s a non-digit in the value');"
上面的“更好”是因為可以在不按任何鍵的情況下輸入值,從而不會引起按鍵事件,而且keyCode可能解析為意外值。 您真正關心的只是控件的價值,而不是控件的實現方式。
另外,請不要限制用戶可以在控件中鍵入的內容,而只是在您要使用它時(例如在表單提交時或控件失去焦點時)測試該值。 通常,用戶會敲入錯誤的鍵,並很樂意自己修復錯誤。 在用戶沒有機會拋出錯誤或自動刪除字符之前,會使控件更難使用,而不是更簡單。
您的密碼
onKeyPress="if(isNaN(String.fromCharCode(event.keyCode))) event.preventDefault();"
不適用於任何版本的Mozilla瀏覽器,因為moz不會公開事件。 無論多么違反直覺的,moz瀏覽器都需要一個帶有聲明參數名稱的函數,例如function(e){...; 它們在事件觸發的函數上任意分配事件對象。
由於您是全局訪問事件對象,因此它不存在[!],因此-此聲明
String.fromCharCode(event.keyCode)
將觸發錯誤; 或Firefox做出讓步,即在調用未定義的'event'關鍵字的屬性時,返回undefined
值進行測試
isNaN(undefined);
總是認為是正確的 。
這就是為什么您對在那里鍵入的所有字符都正確的原因-無論是字母還是數字-都是如此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.