0

入力が数値の場合に簡単な計算を行うHTMLフォームを作成しています。ただし、私の数値入力は、javascript関数によって数値と見なされていません。私はこれがなぜそうなのか混乱していて、次のコードを使用してjsFiddleでいくつかのテストを行いました

HTML

<form>
 <input name=a type=number value='' oninput='checka();'>
 <input name=b type=number value='' oninput='checkb(this);'>
</form>

Javascript

function checka() {
 alert(isNaN(document.forms[0].a.value));
}

function checkb(A) {
 alert(isNaN(this.value));
}

私はその結果に呆然としている。このchecka関数は通常、「5」が入力されるとfalse、「a」が入力されるとtrueを与えるように機能します。ただし、このcheckb関数はどちらの場合にも当てはまります。

私はMozillaのドキュメントisNaNから、入力が数値であるかどうかをチェックする前に、関数が最初に型変換を行う可能性があることを理解しています。

紛らわしい特殊なケースの動作

isNaN関数仕様の非常に初期のバージョン以来、非数値引数に対するその動作は混乱を招きました。isNaN関数の引数が数値でない場合、値は最初に数値に強制変換されます。次に、結果の値をテストして、NaNであるかどうかを判断します。したがって、数値型に強制変換すると有効な非NaN数値(特に、強制変換すると数値が0または1になる空の文字列とブールプリミティブ)になる非数値の場合、「false」の戻り値は予期しないものになる可能性があります。たとえば、空の文字列は確かに「数字ではありません」。混乱は、「数値ではない」という用語が、IEEE-794浮動小数点値として表される数値に対して特定の意味を持っているという事実から生じています。関数は、質問に答えるものとして解釈する必要があります。

これは私が見ている現象を説明するのにどのように役立ちますか?それとも、これは型変換に関係のない別の形の混乱ですか?

4

2 に答える 2

8

this(電話するときcheckb)はwindow…</ p>

checkb(this)(親オブジェクト()なしで呼び出すfoo.checkbため、コンテキストはwindow自動的に設定されます。詳細については、「this」キーワードがJavaScriptオブジェクトリテラル内でどのように機能するかを参照してください。)

…これthis.valuewindow.value(おそらく)undefinedであり、したがって数値ではありません。

this渡したものに対しては何checkb()もしません—関数はその引数に対して何もしません。

あなたはおそらく意味しました:

function checkb(A) {
 alert(isNaN(A.value));
}
于 2012-08-06T15:34:42.263 に答える
1

this.valueは未定義です。これはウィンドウオブジェクトであり、入力ではありません。

これを使用して入力を指す場合は、目立たない方法でイベントハンドラーを割り当てる必要があります。

<form>
 <input name=b type=number value='' id="b">
</form>

<script>    
 function checkb(A) {
  alert(isNaN(this.value));
 }    
 document.getElementById("b").oninput = checkb;  //better to use an addEventListener
</script>
于 2012-08-06T15:35:21.050 に答える