指定されたオプションのフィールドで jQuery 検証を処理する際に、非常に複雑な問題が発生していtype="number"
ます。何が起こるかというと、ブラウザ (この場合は Chrome) は、フォームの送信を傍受するという考えで、ユーザーがフィールドに通常の文字を入力できるようにし、とにかく、フィールド値が照会されると、空の文字列を返します。
先に進む前に、これは仕様に沿ったものであると言わなければなりません。
ユーザー エージェントは、有効な浮動小数点数ではない空でない文字列に値を設定することをユーザーに許可してはなりません。
そして後で:
値のサニタイズ アルゴリズムは次のとおりです。要素の値が有効な浮動小数点数でない場合は、代わりに空の文字列に設定します。
ここに問題があります: オプションの数値入力フィールドに文字を入力すると (Chrome で許可されている場合)、フィールドがオプションであるため、jQuery 検証は正しく検証される空の文字列値を取得します。さらに、フィールドはDBでnull可能であり、喜んで保存されるため、空の文字列サーバー側を取得します。
当分の間、私が考えることができる唯一の回避策はこれです:
$('input[type="number"]').keypress(function (evt) {
if (evt.keyCode < 48 || evt.keyCode > 57)
evt.preventDefault();
});
問題は、たとえば、ユーザーが間違った入力をコピーして貼り付けた場合など、上記が機能しないことです。ここで、ユーザーが愚かなデータを入力しようと決心している場合、結果に直面してそのフィールドを無効にすることしかできないことに気づきましたが、優れた開発者になろうとして、上記の回避策 (また、コピーペーストの別の回避策を書かずに)。