簡體   English   中英

isNaN無法正常工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM