inputのmaxLength問題

html5のinputタグでmaxLength属性を設定するだけで、全てのケースがOKではありません。
日本語を入力する場合、キーボードの確定ボタンを押さなければブラウザのmaxlengthチェックが走りません。しかし、確定ボタンを押す前にonChangeイベントがすでに発生しています。

その為、いっぱいに入力して確定ボタンを押さないまま、Submitをクリックすると、最大文字数を超えた文字列がサーバに送信されてしまいます。

対応案

次の2つの案が考えられます。

案1:onChangeイベントを制御する

inputのonChangeイベントハンドラーで最大文字数超えたら、modelデータを更新しないようにすれば、modelロジックを変更せずに最大文字数の制限を実現できます。

<input
  type="text"
  value={formData.name}
  onChange={(e) => {
    if (e.target.value.length <= 30) {
      this.props.nameChange(e);
    }
  }}
  maxLength={30}
/>
  • デメリット 最後2文字しか入らない状態で「最後」を入力しようとすると、「さいご」の「さい」までが入力されたら、キーボードが消えてしまいます。つまり、漢字に変更できない場合がありますので、ユーザビリティが低下します。

案2:validate処理で文字数をしっかりチェックする

modelクラスで入力内容の最大文字数チェックをおこなって、サーバに送信する前にチェックします。

  • modelクラス
setName(value) {
    return this.set('name', value)
      .setIn(['validations', 'nameIsValidated'],
        value.length > 0 && value.length <= 30);
  }
  • submit処理
submitData(e) {
  const formData = this.props.myState.formData;
  if (formData.getIn(['validations', 'nameIsValidated'] === true) {
    // ここでサーバに送信
  } else {
    // バリデーションエラーを表示
  }
}
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.