HOWTO · JavaScript

JavaScript を使用してフォームを送信する

このチュートリアルでは、JavaScript を使用してフォームを送信する方法を説明します

このページの内容

HTML フォームを JavaScript で送信するには、通常 submitイベント を処理し、入力値を確認したうえで、有効なデータをブラウザーからフォームの action に送信します。以下の例では、フォームを作成し、フィールドの値を読み取り、クライアント側の検証で不完全な入力の送信を防ぎます。送信されたデータを使用する前に、サーバー側の検証も必ず行ってください。

HTML フォームを作成する

各コントロールに name を指定します。この値が、送信されるフォームデータのキーになります。各フィールドにアクセシブルな名前を付けるため、ラベルも設定してください。action はフォームの送信先 URL を指定し、method はブラウザーがデータを送信する方法を指定します。POST リクエストでは、フォームデータがリクエスト本文に含まれます。データをどのように処理または保存するかは、サーバー側で決まります。

<form action="/signup" method="post" id="signup-form">
  <label for="username">Name</label>
  <input id="username" name="username" type="text" required>

  <label for="email">Email</label>
  <input id="email" name="email" type="email" required>

  <button type="submit">Sign up</button>
  <p id="form-message" role="status"></p>
</form>

このページのマークアップは静的な例です。フォームが有効な状態でユーザーが送信ボタンを押すと、ブラウザーは名前が設定されたコントロールの値を /signup に送信します。

フォームにアクセスする

document.getElementById() または document.querySelector() を使い、IDでフォームを選択します。次のブラウザーコードは、上記のマークアップがすでにページ内にあることを前提としています。後続の submit イベントハンドラーでも、同じ form 参照を使います。

const form = document.getElementById("signup-form");

戻り値はフォーム要素です。フォームが解析される前にスクリプトが実行される場合は、フォームの後にスクリプトを配置するか、ドキュメントの準備が整うまで待ちます。

JavaScript でフォームフィールドの値を取得する

フォームの elements コレクションを使うと、各コントロールを name で取得できます。コントロールに現在入力されているテキストは、単数形の .value プロパティから取得します。上記のフォームでは、次のように名前とメールアドレスを読み取れます。

const username = form.elements.username.value.trim();

const email = form.elements.email.value.trim();

HTML の name 属性は、form.elements で使うキーと一致させる必要があります。テキストをトリミングすると、値を確認する前に先頭と末尾の空白を取り除けます。

JavaScript でフォームフィールドのデータを検証する

次のヘルパー関数は、両方のフィールドに文字が入力されているかを確認します。フォームから取得した値を渡すと、ページのハンドラーで使える真偽値を返します。サンプルオブジェクトには名前とメールアドレスが設定されており、プログラムはそれらの値に対する結果を出力します。

function isSignupComplete(username, email) {
  return username.length > 0 && email.length > 0;
}

const sample = { username: "Ada", email: "ada@example.com" };
console.log(isSignupComplete(sample.username, sample.email));
true

ブラウザーはフォームの submitイベント を発生させる前に、required と type="email" を検証します。名前が空の場合やメールアドレスの形式が正しくない場合は、この段階で入力が拒否されます。リスナーは実行されず、preventDefault() も呼び出されず、ブラウザー独自の検証メッセージが表示されます。一方、空白だけの名前は required を通過するため、下のリスナーに渡されます。トリミングすると空文字列になり、独自のチェックが preventDefault() で送信を止め、ページにメッセージを表示します。

ページのハンドラーでは、選択したフォームにリスナーを登録し、現在の入力値を使って同じチェックを行います。

form.addEventListener("submit", (event) => { const username = form.elements.username.value.trim(); const email = form.elements.email.value.trim(); const message = document.getElementById("form-message"); if (!isSignupComplete(username, email)) { event.preventDefault(); message.textContent = "Enter your name and email."; return; } message.textContent = "Submitting…"; });

チェックに通った場合、ハンドラーはブラウザー標準のフォーム送信の流れを維持します。チェックに失敗した場合は、event.preventDefault() によってブラウザーからの送信を防ぎ、メッセージで修正が必要な内容を伝えます。これはユーザーへの案内を目的としたクライアント側の検証であり、セキュリティ境界ではありません。このページや JavaScript を使わずにリクエストを送ることもできるため、送信先ではサーバー側の検証が必要です。

ほかのコードから送信を開始する場合は、form.requestSubmit() を使います。通常の検証と submit イベントの流れに従うためです。form.submit() を呼び出すと、制約検証も submit イベントの発生も行わずに直接送信されるため、このようなリスナーは実行されません。