現役システムエンジニアの備忘録

技術スキルや用語などの記録を残していきます

Form(フォーム操作)

form.actionの使い方|送信先URLの選び方【JavaScript入門】

投稿日:2019年6月1日 更新日:

本記事にはプロモーション(アフィリエイト広告)を含みます。

この記事で分かること

  • form.actionでフォームの送信先を設定する方法
  • 相対URL・ルート相対URL・絶対URLの違いと選び方
  • methodと送信の関係
  • submit()とrequestSubmit()の違い
  • フォーム付きのサンプルと、送信時に確認するポイント

この記事は、2026年10月時点のHTML StandardとMDN Web Docsに基づいています。対象:フォーム送信のHTML標準仕様と、JavaScriptのECMAScript 2023(ES2023)までの記法。ブラウザーの個別バージョンは固定していません。

フォームの送信先を変えたいのに、作成中のページと公開後のページでURLが合わない。送信ボタンを押しても、期待したページに移動しない。そんなときは、form.actionに設定するURLの種類と、フォームの送信方法を確認しましょう。

補足:フォームとは?
名前や問い合わせ内容などを入力し、ボタンを押して送るための入力欄のまとまりです。
補足:URLとは?
インターネット上のページやファイルの場所を示す文字列です。ホームページの住所のようなものです。
補足:form.actionとは?
フォームの内容をどこへ送るかを指定する設定です。送信先の住所を書き換えるようなものです。

この記事では、送信先がどのように決まるのかを、URLの具体例とサンプルで説明します。サンプルは、自分のパソコン上でページを表示する仕組みを使い、送信後に同じページを再表示します。外部サービスや専用の送信先は使いません。

手順では、Google ChromeやSafariなど、ホームページを見るためのアプリを使います。フォーム操作の基本から順に学びたい場合は、JavaScript Formロードマップ|初心者が最短でフォーム操作を理解するためのガイドもあわせてご覧ください。



結論:送信先は環境に合うURLで指定する

form.actionには、フォームを送る先のURLを設定します。同じサイト内へ送るなら相対URLやルート相対URL、送信先のホスト名も固定したいなら絶対URLが候補です。

補足:相対URLとは?
今いるページの場所を基準に、別の場所を表す書き方です。「send.php」のように、行き先の一部だけを書きます。
補足:ルート相対URLとは?
今いるページの場所ではなく、サイトの入口から行き先を表す書き方です。「/send.php」のように、先頭を「/」にします。
補足:ホスト名とは?
URLの中で、接続するコンピューターやサービスの場所を示す部分です。たとえば「https://example.com/shop/」では「example.com」がホスト名です。
補足:絶対URLとは?
「https://example.com/send」のように、通信方法や接続先を含めて行き先全体を指定する書き方です。

絶対URLは接続先の名前まで指定します。作成中のページと公開後のページで接続先が異なる場合、同じ値を使うと別の環境へ送ってしまうことがあります。「絶対URLなら常に安全」とは限りません。

同じサイト内の送信先は、サイトの置き場所に合わせて選びます。
サイトの入口からの場所が変わらないならルート相対URL、現在のページからの場所が変わらないなら相対URLが候補です。ホスト名が環境ごとに異なる場合は、その環境の設定に応じて送信先を決めます。

相対URLは現在のページを基準に解決される

相対URLは、通常、現在のページのURLを基準にして実際の送信先が決まります。ページに送信先の基準を指定する設定がある場合は、その設定も影響します。次の表は、基準となるページをhttps://example.com/shop/form.htmlとした場合の例です。

設定する値 URLの種類 解決後の送信先 特徴
send.php 相対URL https://example.com/shop/send.php 現在のページと同じ階層を基準にします。
../send.php 相対URL https://example.com/send.php 現在のページから一つ上の階層を基準にします。
/send.php ルート相対URL https://example.com/send.php ホスト名は現在のページのものを使い、サイトの入口から指定します。
https://api.example.net/send 絶対URL https://api.example.net/send ホスト名も含めて指定します。

ルート相対URLの/send.phpは、サイトがhttps://example.comとhttps://example.com/my-siteのどちらに置かれるかで、意図した場所へ届くかが変わることがあります。サイトを置く場所も含めて確認してください。

ページ内にbase要素が設定されていると、相対URLの基準が変わる場合があります。相対URLが予想と違う場所を指すときは、ページの設定も確認してください。

補足:base要素とは?
ページ内の相対URLがどこを基準にするかを指定する部品です。

下の図は、同じページから各URLを指定したとき、送信先がどのように決まるかを示しています。

form.actionに設定するURLの種類ごとに、現在のページやサイトの入口、指定したホスト名を基準として送信先が決まる様子を示した図です。

form.actionからURLを読むと、相対URLを設定した場合でも、基準となる場所をもとに解決されたURLとして扱われます。

form.actionとmethodは役割が違う

form.actionは送信先を、methodはデータの送り方を指定します。送信先だけ変えても、データの送り方が目的に合っていなければ、期待した送信にならないことがあります。

  • GET:入力内容を送信先のURLに付けて送ります。検索条件など、URLで見えても問題のない情報に使われます。
    補足:GETとは?
    情報を受け取るときなどに使う送り方です。フォームでは、入力内容がURLに加わる形で送られます。
  • POST:入力内容をURLとは別に送ります。URLに内容を表示したくないときなどに使われます。
    補足:POSTとは?
    入力内容をURLとは別の形で送る方法です。ただし、POSTを選ぶだけで情報が暗号化されるわけではありません。

どちらを使うかは送信先の仕組みや目的に合わせて決めます。POSTにすれば秘密が守られる、という意味ではありません。機密情報を含める場合は、送信先や通信方法も確認してください。

form.actionとmethodを一緒に設定する例です。送信先がPOSTを受け付ける場合は、次のように設定できます。

const form = document.getElementById("contactForm");
form.action = "/api/contact";
form.method = "post";

このコードでは、ページ内のcontactFormというフォームを見つけ、送信先と送り方を設定しています。constは、あとから別の値に入れ替えない名前を作る書き方です。送信先には、フォームの内容を受け取る仕組みが必要です。

実行結果:

form.action:現在のページの基準に解決された「/api/contact」のURL
form.method:post
注意:/api/contactのようなURLへ送るには、その場所でフォームの送り方と内容を受け付ける仕組みが必要です。送信先が受け付けない形式で送ると、意図した結果になりません。



フォームを含むサンプルで送信先を切り替える

始める前に、テキストエディター、Python 3、ブラウザーを用意します。ファイルを直接開くのではなく、自分のパソコン上で動くページ表示の仕組みからページを開きます。

補足:テキストエディターとは?
文章やプログラムの文字を入力して、ファイルとして保存するアプリです。
補足:Pythonとは?
プログラムを作るための言葉の一つです。この手順では、ページを手元で表示する機能を起動するのに使います。

次の例では、選択メニューから送信先の種類を選び、名前を入力して送信します。実際の送信先は同じページのままです。選んだ種類はrouteという名前の入力データとしてURLに加わり、送信後にページへ表示されます。このサンプルは、異なる窓口へ実際に振り分ける処理ではなく、送信内容を確かめる例です。

補足:選択メニューとは?
複数の候補から、使いたいものを選ぶための入力欄です。

次のコード全体をform-action-sample.htmlという名前で保存します。

<!doctype html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>送信先の切り替え例</title>
</head>
<body>
  <h1>送信先の切り替え例</h1>

  <form id="contactForm" action="" method="get">
    <label for="route">送信先の種類</label>
    <select id="route" name="route">
      <option value="contact">問い合わせ</option>
      <option value="support">サポート</option>
    </select>

    <label for="name">名前</label>
    <input id="name" name="name" required>

    <button type="submit">送信</button>
  </form>

  <p id="result"></p>

  <script>
    const form = document.getElementById("contactForm");
    const route = document.getElementById("route");
    const result = document.getElementById("result");

    form.action = window.location.pathname;

    const params = new URLSearchParams(window.location.search);
    const submittedRoute = params.get("route");

    if (submittedRoute === "contact" || submittedRoute === "support") {
      route.value = submittedRoute;
    }

    const name = params.get("name");

    if (name) {
      result.textContent =
        `${name}さんの入力を受け取りました。送信先の種類:${submittedRoute}`;
    }
  </script>
</body>
</html>

このコードでは、選んだ種類を送るため、選択メニューにname="route"を付けています。ここでいう属性は、入力欄などの部品に名前や設定を付けるものです。フォーム送信で送られるのは、名前と値が設定された入力項目です。送信先を現在のページにし、入力項目の値をURLに加えるのがmethod="get"です。

form.actionには現在のページのパスを設定しています。選んだ種類は送信先そのものではなく、名前と同じくフォームから送るデータです。送信後はURLからその値を読み取り、選択状態と画面の文章に反映します。

補足:パスとは?
URLの中で、サイト内のどのページや場所を指すかを表す部分です。

保存したファイルがあるフォルダーで、次の手順を行います。手順3では、localhostという名前を使って、自分のパソコン上で動かすページを開きます。

  1. 文字でパソコンに指示を入力する画面を開き、サンプルファイルがあるフォルダーへ移動します。
  2. python -m http.server 8000を実行します。環境によっては、python3 -m http.server 8000を使います。
  3. ブラウザーでhttp://localhost:8000/form-action-sample.htmlを開きます。
  4. 送信先の種類で「サポート」を選び、名前に「花子」と入力します。
  5. 送信ボタンを押します。名前が空欄の場合は、入力を求める表示が出ます。
  6. ページが再表示されたら、名前と送信先の種類が表示されていることを確認します。
  7. ブラウザーのURL欄で、「route=support」と名前のデータが付いていることを確認します。

この手順で「support」を選び、「花子」と入力すると、送信後のURLにはroute=supportと名前のデータが付き、ページには名前と「support」が表示されます。日本語の名前は、URL上では文字を変換した形で表示されることがあります。

実行結果:

URLの例:
http://localhost:8000/form-action-sample.html?route=support&name=%E8%8A%B1%E5%AD%90

画面表示:
花子さんの入力を受け取りました。送信先の種類:support

フォームの送信先を同じページに設定し、選択メニューにname="route"を付けることで、選択した値も送信データに含まれます。GETでは、名前や選択内容がURLに加わります。送信後の表示は、ページを再度開いたときにURLから値を読み取って作っています。

注意:このサンプルは、入力した名前をURLに表示します。実際の個人情報や秘密の情報は入力しないでください。問い合わせを受け取る仕組みや、実際の送信先へ情報を振り分ける処理は含んでいません。

開発環境と本番環境で送信先を切り替える

送信先のホスト名が環境ごとに異なる場合は、環境に合わせた設定値を用意し、その値をform.actionへ設定します。次の例では、ページの設定に書かれた環境名に応じて送信先を選びます。

<html lang="ja" data-environment="development">

このHTMLを開発環境で使うと、環境名はdevelopmentになります。本番環境ではproductionに変更します。続けて、フォームに次のJavaScriptを設定します。

const form = document.getElementById("contactForm");

const actionByEnvironment = {
  development: "https://dev.example.com/contact",
  production: "https://example.com/contact"
};

const environment = document.documentElement.dataset.environment;
const action = actionByEnvironment[environment];

if (action) {
  form.action = action;
} else {
  throw new Error("送信先の環境設定を確認してください。");
}

example.comは説明用の例です。実際に使うときは、開発用と本番用それぞれの正しい送信先に置き換えます。このコードは、開発環境なら開発用URL、本番環境なら本番用URLをform.actionへ設定します。

実行結果:

環境名が development の場合:
form.action は https://dev.example.com/contact

環境名が production の場合:
form.action は https://example.com/contact

それ以外の環境名の場合:
「送信先の環境設定を確認してください。」というエラーが発生し、コードによるform.actionへの代入は行われません。
フォームに別の送信先がすでに設定されている場合は、その設定が残ります。action属性がない場合や空の場合は、フォームの既定の送信先は現在のページです。

ブラウザーの開発者ツールでフォームを調べると、設定されたactionの値を確認できます。開発環境では開発用URL、本番環境では本番用URLになっていることを確かめてください。

補足:開発者ツールとは?
ブラウザーに備わっている、ページの内容や動きを調べるための機能です。

submit()とrequestSubmit()は送信前の処理が異なる

JavaScriptから送信を始める方法には、form.submit()とform.requestSubmit()があります。どちらもフォームを送れますが、送信前の確認やイベントの動きが同じではありません。

補足:イベントとは?
選択肢を変える、ボタンを押すなど、ページ上で起きた出来事です。
補足:submitイベントとは?
フォームを送信しようとしたときに発生する出来事です。送信前に入力内容を確認する処理などを結び付けられます。
方法 submitイベント 入力条件の確認 主な注意点
form.submit() 発生しません。 行いません。 送信前の確認処理を通さず送信します。
form.requestSubmit() 発生します。 行います。 通常の送信ボタンを押した場合に近い流れで送信します。

ここでいうメソッドは、部品に用意されている処理を実行するための呼び出し方です。submit()のように、名前の後ろに括弧を付けて使います。

通常の送信ボタンと同じように入力条件の確認やsubmitイベントを通したい場合は、requestSubmit()を使います。submit()はそれらを行わずに送信するため、意図せず入力確認や送信前の処理を飛ばしてしまうことがあります。

注意:フォーム内にname="submit"などの名前を付けた部品があると、フォームのsubmit処理を同じ名前の部品が隠し、form.submit()を呼べなくなる場合があります。送信処理が呼べないときは、部品の名前も確認してください。

requestSubmit()は送信ボタンを押す流れに近い方法です。ただし、フォームの設定や送信先が正しいことまで自動で保証するものではありません。送信先と入力内容を別途確認してください。

requestSubmit()の対応状況はブラウザーによって異なる可能性があります。利用するブラウザーのバージョンをMDN Web Docsの対応表で確認してください。この記事では、個別の最低対応バージョンは指定していません。

補足:MDN Web Docsとは?
ウェブページを作る人向けに、技術の使い方や決まりを説明している資料です。



よくある失敗と確認方法

送信先が予想と違う

相対URLの基準を、サイトの入口だと思い込んでいる場合があります。現在のページのURLを確認し、表の例に当てはめて送信先を確認してください。ページ内にbase要素がある場合は、それも調べます。

開発環境から本番環境へ送ってしまう

ホスト名を含む絶対URLが、環境ごとに切り替わっていない可能性があります。環境ごとの設定値を用意し、その環境に合う値がform.actionへ設定されているかを確認します。開発環境では開発用URL、本番環境では本番用URLが表示されることを、それぞれ確かめてください。

送信ボタンを押しても送信されない

  • 必須入力が空欄になっていないか確認します。
  • form.actionが意図したURLになっているか確認します。
  • 送信先が、設定した送り方や入力内容を受け付けるか確認します。
  • JavaScriptのエラーがないか、ブラウザーの開発者ツールで確認します。
  • form.submit()を使っている場合は、送信前の確認処理を通す必要があるか見直します。

URLに入力内容が表示される

method="get"では、入力内容がURLに付いて送信されます。URLに表示してよい内容か確認し、表示すべきでない情報なら送信方法や送信先の設計を見直してください。POSTに変えるだけで暗号化されるわけではないため、通信方法や受信側の安全性も確認が必要です。

送信先を決めるときの注意点

  • 利用者が入力したURLを、そのままform.actionに設定しないでください。送信先を選ぶ場合は、用意した候補から選ぶなど、送信先を限定します。
  • 外部のサイトへ送る場合は、送信先のホスト名と、何を送るかを確認してください。
  • 個人情報や秘密の情報を送る場合は、送信先と通信方法が適切か確認してください。
  • GETでは入力内容がURLに含まれるため、秘密の情報を送る用途には向きません。

公式資料で仕様を確認する

フォームの送信方法や送信前の動きを確認するときは、標準仕様やブラウザーの資料を参照してください。特にrequestSubmit()を使う場合は、利用するブラウザーの対応状況を確認してください。

補足:HTML Standardとは?
ホームページの作り方や、入力内容を送るときの決まりを定めた文書です。

JavaScriptを基礎から学びたい方へ(書籍) PR

フォーム操作だけでなく、JavaScriptの基本から順に学びたい人には、書籍も選択肢になります。記事のサンプルは送信先の設定に絞っているため、基本文法やページ操作もあわせて学びたい場合に検討できます。

書籍で学ぶのが向いている人

  • JavaScriptを基礎から順序立てて学びたい人
  • サンプルコードを読みながら、自分で試したい人

これからのJavaScriptの教科書

出版社の案内では、基本文法からフォーム操作、ページ操作、非同期処理などを扱い、サンプルコードを試しながら学ぶ構成です。対象はECMAScript 2023(ES2023)です。

補足:ECMAScriptとは?
JavaScriptの書き方や動きについて定めた決まりです。ES2023は、その決まりの2023年版を指します。

この本で学べること:

  • JavaScriptの基本文法や関数、データの扱い方
  • ページやフォームの操作、非同期処理
  • サンプルコードを使った学習

注意点:全608ページのため、要点だけを短時間で確認したい人には分量が多く感じられる場合があります。特定の新しい仕様や、特定の開発用ツールを中心に学ぶための本ではありません。

form.actionに関するよくある質問

Q1

form.actionを指定しない場合、どこへ送信されますか?

A

通常は、現在表示しているページが送信先になります。送信先を明確にしたい場合は、HTML側のaction設定かJavaScriptのform.actionで指定してください。

Q2

送信ボタンごとに送信先を変えられますか?

A

はい。送信ボタンにformactionを付けると、そのボタンで送信するときの送信先を指定できます。フォーム全体の設定よりボタンごとの指定を優先したい場合に使えます。

Q3

form.actionを設定するだけで、フォームは送信されますか?

A

いいえ。form.actionは送信先を設定するだけで、送信そのものは実行しません。送信ボタンを押すか、requestSubmit()などで送信を開始します。

Q4

相対URLを設定したあと、form.actionから読み取ると何が返りますか?

A

通常は、ページの基準となる場所をもとに解決されたURLが返ります。たとえば現在のページがhttps://example.com/shop/form.htmlで、基準を変える設定がなければ、send.phpを設定したときの値はhttps://example.com/shop/send.phpになります。



まとめ

  • form.actionはフォームの送信先を決める
  • 相対URLは現在のページを基準に解決される
  • ルート相対URLはサイトの入口を基準にし、絶対URLはホスト名まで指定する
  • methodは送信方法を決め、GETでは入力内容がURLに付く
  • submit()は入力条件の確認やsubmitイベントを通さず、requestSubmit()は通常の送信ボタンに近い流れで送信する
  • 開発環境と本番環境でホスト名が異なる場合は、環境に応じた設定値を使う

サンプルでは、送信前後のURLと画面表示を確かめられます。フォーム操作を順に学ぶ場合は、JavaScript Formロードマップから進めてください。

このブログは Xserver 上の WordPress で運用しています。
表示速度が速く、安定しているのでブログ初心者にもおすすめです。

→ レンタルサーバー エックスサーバー

-Form(フォーム操作)

執筆者: