コース一覧
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分

入力欄の値を取る

入力欄の value は文字列
解説

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

  • 入力欄に打たれた文字は value で読みます。textContent には入りません
  • value は数字を打っても常に文字列で返ってきます

打った文字が textContent に入っていない

ここまでのイベント処理は、押されたかどうかだけを見ていました。今回からは、見ている人が打ち込んだ内容そのものを扱います。ところが、いつもの調子で中身を読もうとすると空っぽが返ってきます。

JavaScript

const keyword = document.querySelector("#keyword"); console.log(keyword.textContent); // "" いつまでも空のまま

textContent はタグの中に書かれた文字を指します。入力欄に打った文字は HTML の中身ではなく、要素が持っている「いまの値」です。input はそもそも閉じタグを持たないので、中身という考え方が当てはまりません。読むときは value を使います。

JavaScript

console.log(keyword.value); // 打たれた文字がそのまま出る

value は読むだけでなく、代入して書き換えることもできます。送信し終わったあとに keyword.value = "" と入れれば、入力欄を空に戻せます。

数を打っても、返ってくるのは文字列

ここが最初のわなです。type="number" の欄に 5 と打っても、value は数値の 5 ではなく文字列の "5" です。

JavaScript

const price = document.querySelector("#price").value; // "5" console.log(price + 1); // "51" console.log(Number(price) + 1); // 6

第1章で見た文字列の連結が、そのまま起きています。足し算のつもりが横に並ぶ、というのはフォームを触りはじめた人が必ず一度は通る道です。数として使うなら Number() を通す、と決めておいてください。

逆に、文字を数えるなら文字列のままが都合よく、.length がそのまま使えます。日本語も英語も 1 文字は 1 として数えます。

JavaScript

console.log("こんにちは".length); // 5 console.log("".length); // 0

何も打たれていない入力欄の value は null でも undefined でもなく、空文字列の "" です。"" は falsy なので、if (!input.value) と書くだけで未入力の判定になります。

打つたびか、離れたときか

値が変わったことを知らせるイベントは 2 つあります。

イベントいつ起きるか向いているもの
input1 文字打つたび。消すたびにも起きる文字数の表示、その場での絞り込み
change入力を終えて欄から離れたとき重い処理、確定してからの検証

input は打鍵のたびに起きるので、反応がとても細かくなります。打った瞬間に画面へ返したいものはこちらです。change は値が変わったうえでフォーカスが外れたときに 1 回だけ起きるので、select の選択やサーバーへの問い合わせのような重い処理に向いています。

JavaScript

keyword.addEventListener("input", function (event) { console.log(event.target.value); });

前回の event がここでも使えます。event.target は出来事が起きた入力欄そのものなので、event.target.value で中身を読めます。外側の変数を使っても同じ結果になりますが、event.target で書いておくと、同じ関数を複数の入力欄で使い回せます。

なお、JavaScript から value に代入したときは input イベントが起きません。人が打ったときだけ起きるイベントだからです。代入と同時に表示も直したいなら、表示を更新する処理を関数にまとめておいて、代入のあとで自分から呼びます。

よくある間違い

  • textContent で読もうとする — 何を打っても空のままです。入力欄は value でしか読めません
  • 文字列のまま計算する — "5" + 100 は "5100" です。数として足すなら Number() を先に通します
  • document にイベントを登録する — ページ内のどの入力欄を打っても動いてしまいます。登録する相手は、値を見たい入力欄そのものです

課題

  1. HTML の #message のすぐ下に id="message-count" class="form-hint" の p を足し、最初の表示を「0 文字」にする
  2. JavaScript で #message に input イベントを登録する
  3. 処理の中で value.length を使い、#message-count に「5 文字」の形で表示する
  4. 文字を消したときも表示が減ること

ヒント

入力欄の中身は `textContent` ではなく `value` です。長さは `value.length` で取れます

`messageInput.addEventListener("input", function (event) { ... })` の形にすると、中で `event.target.value` が使えます

表示は `event.target.value.length + " 文字"` のように、数のうしろに文字列をつなぎます

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

できているか

  • #message-count の段落がある
  • #message-count がお問い合わせの中にある
  • 最初から「0 文字」と出ている
  • 5 文字打つと「5 文字」になる
  • 消すと 0 に戻る
エディタを読み込んでいます