フォーム送信の検知

submit preventDefault FormData

フォームの送信イベントをJavaScriptで制御し、ページ遷移なしの非同期送信や入力値の処理を行います。

デモ:フォーム送信

コード例

js
const form = document.querySelector('form');

form.addEventListener('submit', async (e) => {
  // ページ遷移(デフォルト動作)をキャンセル
  e.preventDefault();

  // FormData で入力値を一括取得
  const data = new FormData(e.target);
  const name = data.get('name');     // input[name="name"]
  const email = data.get('email');
  // Object変換
  const obj = Object.fromEntries(data.entries());
  console.log(obj); // { name: "...", email: "..." }

  // fetch でAPI送信
  try {
    const res = await fetch('/api/submit', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(obj),
    });
    if (!res.ok) throw new Error('送信失敗');
    const result = await res.json();
    showSuccess(result);
  } catch (err) {
    showError(err.message);
  }
});

// submit ボタンでなくEnterキーでの送信も検知される
// type="button" にすると form送信はトリガーされない

比較:FormData 送信 vs JSON 送信

観点FormData(multipart)JSON
ファイル送信✅ 対応❌ 不可(Base64化が必要)
Content-Type自動設定(multipart/form-data)手動設定必要
ネストデータ△ 難しい✅ 簡単
推奨場面ファイルアップロード、HTMLフォームそのままAPIとのデータ送受信

NEWe.submitter(押されたボタンを特定)

フォームに複数の送信ボタンがある場合、どのボタンが押されたかを e.submitter で取得できます。

js
form.addEventListener('submit', (e) => {
  e.preventDefault();

  // どのボタンが押されたか特定
  const submitter = e.submitter;
  console.log(submitter.name);  // ボタンのname属性
  console.log(submitter.value); // ボタンのvalue属性

  if (submitter.name === 'save') {
    saveDraft();
  } else if (submitter.name === 'publish') {
    publish();
  }
});

// HTML例
// <button type="submit" name="save">下書き保存</button>
// <button type="submit" name="publish">公開</button>

jQueryで書くとこうなる

jQueryでは .on('submit') でフォーム送信を検知し、return false または e.preventDefault() でデフォルト動作を止めていました。バニラJSでは addEventListener('submit')event.preventDefault() で同等の処理が可能です。
js
// フォーム送信の検知
$('#myForm').on('submit', function (e) {
  e.preventDefault();
  console.log('送信された');
});

// return false でデフォルト動作を止める(jQueryのみの書き方)
$('#myForm').on('submit', function () {
  // 処理
  return false;
});

// 入力値の取得
$('#myForm').on('submit', function (e) {
  e.preventDefault();
  const name = $('#name').val();
  const email = $('#email').val();
  console.log(name, email);
});

// フォームのリセット
$('#myForm')[0].reset();

// プログラムからの送信
$('#myForm').trigger('submit');
💡 上記のデモは、バニラJS(ブラウザ標準API)です。

🤖 AIプロンプトテンプレート

以下の要件を満たすTypeScript + Reactコンポーネントを作成してください。

- フォームのsubmitイベントとevent.preventDefault()を使ったバリデーションのサンプルを示す
- 必須チェック・形式チェック(メール・電話番号)のバリデーション例を含める
- リアルタイムバリデーション(入力中にエラー表示)のサンプルを含める
- フォーム送信前の確認ダイアログと送信中のローディング状態の例を示す
- バリデーションエラーをユーザーにわかりやすく表示するUIのサンプルを含める
- コメントは日本語で記述する

⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。