コース一覧
JavaScriptでWebページを動かす
フォーム送信を制御する

JavaScriptでWebページを動かす

DOM から要素を取得・更新・追加し、クリック・入力・フォーム送信に反応する処理を作る全 20 レッスン(411 分)のコースです。タイマーと localStorage も使い、最後は入力を保存できるひとことメモを仕上げます。用意された HTML/CSS を使うため、学習の中心は JavaScript です。

1
DOM のきほん
01. DOM とは何か15分
02. 要素を取得する20分
03. テキストを書き換える20分
04. class を付け外しする20分
05. 要素を作って追加する20分
06. 配列から一覧を描画する25分
07. つくる ギャラリーをデータ駆動にする30分
08. 第1章まとめクイズ10分
2
イベント処理
01. クリックに反応する18分
02. event オブジェクト20分
03. 入力欄の値を取る18分
04. フォーム送信を制御する20分
05. つくる ダークモード切替25分
06. つくる フォームの入力チェック25分
07. 第2章まとめクイズ10分
3
タイマーと総合制作
01. setTimeout と setInterval20分
02. localStorage で保存する20分
03. つくる ひとことメモウィジェット30分
04. 自由拡張30分
05. 完成と次のステップ15分

フォーム送信を制御する

送信の既定動作を止める
解説

このレッスンで分かること

  • submit が起きるのはボタンではなく form 要素です
  • event.preventDefault() で、ブラウザの既定の動きを止められます

送信ボタンを押すと、打った文字が全部消える

お問い合わせフォームの送信ボタンを押してみてください。一瞬画面が白くなり、入力していた文字がすべて消えたはずです。エラーではありません。ブラウザが決められたとおりに動いた結果です。

form 要素には生まれつきの役割があります。中の入力内容をまとめてサーバーへ送り、返ってきた新しいページを表示する、という役割です。送り先を書かなければ自分自身のページに送るので、同じページが読み込み直されます。変数もイベントの登録も作り直しになり、前回書いた文字数の表示も、打った内容も、まとめて消えます。

インターネットの初期からある正しい仕組みです。ただ、いまのページで入力を調べたり、その場に結果を出したりしたいときには邪魔になります。送られる前に止めて、こちらで面倒を見たいのです。

止める相手はボタンではない

押されるのはボタンですが、イベントが起きるのは form です。ボタンの click で受けるやり方も一応は動きますが、すすめられません。フォームは入力欄で Enter キーを押しても送信されるからです。

受ける場所拾えるもの抜けるもの
button の clickボタンを押したとき入力欄での Enter 送信
form の submit押したときも Enter のときもなし

登録する相手を取り違えると、エラーも出ないまま何も起きません。

JavaScript

// button では submit が起きないので、この処理は一度も呼ばれない document.querySelector(".submit-button") .addEventListener("submit", function (event) { event.preventDefault(); });

既定の動きを取り消すのが event.preventDefault() です。名前のとおり「既定の動きを、あらかじめ防ぐ」という意味で、event オブジェクトが持っています。前回まで「要らなければ書かなくてよい」と言っていた引数の event が、ここでは必須になります。

既定の動きを持つのは submit だけではありません。リンクの click はページを移動しますし、右クリックはブラウザのメニューを出します。どれも同じメソッドで止められます。

JavaScript

const helpLink = document.querySelector("#help-link"); helpLink.addEventListener("click", function (event) { event.preventDefault(); // ページを移動させない console.log("移動を止めて、その場で説明を出す"); });

まず止める、それから考える

書く場所が大事です。処理の先頭近くに置いてください。途中でエラーが起きて preventDefault() の行まで届かないと、ページはそのまま送信されてしまいます。原因の分かりにくい不具合になるので、まず止める、それから考える、の順にします。

JavaScript

const surveyForm = document.querySelector(".survey-form"); surveyForm.addEventListener("submit", function (event) { event.preventDefault(); // まず止める // 止めたあとに、好きなだけ処理を書く });

止めるだけで終わると、押しても何も起きないページになります。見ている人は壊れていると思います。止めたら必ず、代わりの反応を返してください。メッセージを 1 行出す、ボタンの文字を変える、どれでもかまいません。押した手応えが返らない画面は、動いていないのと区別が付きません。

いま多くの Web サービスで、送信してもページが切り替わらないのは、どれもこの preventDefault() が土台にあるからです。ページが変わらないので、入力した内容も前の表示もそのまま残り、必要なところだけを書き換えられます。

解説

return false で止まると書かれた古い記事がありますが、あれは onsubmit 属性の書き方の話です。addEventListener で登録した関数の中では効きません。

よくある間違い

  • 引数を受け取っていない — function () { のまま event.preventDefault() を呼ぶと event is not defined で止まり、止められないまま送信されます。丸かっこに event と書き足します
  • メソッドの丸かっこを忘れる — event.preventDefault; は関数を参照しただけで、呼んでいません。エラーも出ないので気付きにくく、ページだけが読み込み直されます

課題

  1. HTML の .contact-form の中、送信ボタンのすぐ下に id="form-message" の空の p を足す
  2. JavaScript で .contact-form に submit イベントを登録する
  3. 処理の引数に event を受け取り、いちばん先頭で event.preventDefault() を呼ぶ
  4. そのあと #form-message に「送信を受け付けました」と表示する

ヒント

登録する相手はボタンではなく `.contact-form` です。イベント名は `submit` です

`event.preventDefault()` は処理のいちばん先頭に置きます。あとに置くと、途中で止まったときに送信されてしまいます

`event.preventDefault` と丸かっこを付け忘れると、参照しただけで呼んでいないことになります

index.html
style.css
script.js
プレビュー

できているか

  • お問い合わせフォームがある
  • #form-message の段落がある
  • #form-message がフォームの中にある
  • 送信しても再読み込みされず、メッセージが残る
エディタを読み込んでいます