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

つくる ギャラリーをデータ駆動にする

解説

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

  • 同じ一覧を HTML と配列の両方が持っていると、直す場所が決まらなくなります
  • 描き直す関数は、まず中身を空にしてから描くと、何度呼んでも結果が同じになります

作品を 1 つ足したいとき、どちらに書けばいいのか

いま作品の一覧には 5 枚のカードが並んでいます。ところが出どころは 2 か所に分かれています。HTML に直接書いた article が 3 枚、配列から JavaScript が描いたものが 2 枚です。

ここで作品を 1 つ増やしたくなったとき、どちらに足せばいいのでしょうか。どちらでも出せてしまいます。だから半年後の自分は迷いますし、並び順を変えたくなったときには HTML と JavaScript を見比べる必要が出ます。これが二重管理です。

答えは単純で、片方に寄せます。寄せる先は配列のほうです。データにしておけば、並べかえも絞り込みも、あとから来る機能を全部その 1 か所で受け止められます。

寄せる手順は 2 つに分けてください。いきなり HTML の 3 枚を消すと、うまくいかなかったときに何が原因なのか分からなくなります。

  1. まず配列に 3 枚ぶんのデータを足し、JavaScript が描いたカードが HTML の 3 枚と同じ見た目になることを確かめる
  2. 見た目がそろってから、HTML の article 3 つと、それを掴んでいた古いコードを消す

1 の途中では、同じ作品のカードが 2 枚ずつ並びます。それでいいのです。並んでいる状態で、文字の入り方や枠の付き方をよく見比べます。ここで違いに気づいておけば、消したあとに慌てずに済みます。

解説

動いているものを置きかえるときは、いつでもこの順番が安全です。新しいほうを先につくり、両方が同じ結果になることを見てから古いほうを外す。実務では並行稼働と呼ばれるやり方で、Web に限らずデータの移行でも使われます。

2 回呼ぶと、カードが倍になる

前回書いた forEach は、そのままでは 1 回しか使えません。append は足すだけで、前にあったものを消さないからです。同じ関数をもう一度呼べば、同じカードがもう一組ぶら下がります。

そこで、描き直す関数の 1 行目で中身を空にします。

JavaScript

const list = document.querySelector(".hobby-list"); list.textContent = ""; // 先に空にしてから描き始める

textContent に空文字を入れると、子要素はまるごと消えます。第3章で「代入すると中身が消える」と話したあの性質を、ここでは消すために使います。

この 1 行があると、何度呼んでも結果が同じになります。HTML に書いてあった 3 枚も、この行で消えます。つまり消し忘れても画面は正しくなります。それでも HTML からは消してください。読む人が「この 3 枚はどこに出ているのだろう」と探すことになるからです。

「1 枚目を強調する」と書くのをやめる

class を付け外しした回では、手で 1 枚目に featured を付けました。並び順が変われば、強調される作品も変わってしまう書き方です。せっかくデータを持っているので、値のほうに判断させます。

JavaScript

if (hobby.times >= 10) { item.classList.add("pinned"); }

つくる関数の中にこうした 3 行を置くだけで、条件に合うものだけが自動で目立ちます。前は「1 枚目を強調する」と書いていました。いまは「よく見られているものを強調する」と書いてあります。データが変われば、強調される相手も勝手に変わります。第4章の条件分岐が、画面の見え方を決める道具になりました。

完成すると、works の 1 行を書きかえるだけで画面がそのとおりに変わります。作品を足せばカードが増え、published を false にすれば消える。DOM を組み立てるコードには一切さわりません。これが、この章の到達点です。

よくある間違い

  • 空にせずに描いて、カードが倍になる — 描き直す関数の 1 行目を空にする、と決めてしまうのがいちばん確実です
  • HTML の見た目と、JS でつくる見た目がずれる — 原因の大半は class の付け忘れです。HTML では <article class="work-card"> なのに、className を書き忘れると枠も余白も付かない裸の article が並びます
  • 消したはずの要素を掴んだままにする — HTML から要素を消すと、それを掴んでいた古いコードが undefined を触りにいきます

JavaScript

const items = document.querySelectorAll(".hobby-item"); // 空になった items[0].classList.add("pinned"); // TypeError で止まる

TypeError で止まれば、その下の処理も全部動きません。使わなくなったコードを消すのは、読みやすさのためだけではないのです。

課題

  1. works に 6 件のオブジェクトを入れる。HTML に書いてあった 3 枚もデータとして入れ、「つくりかけの計算機」だけ published を false にする
  2. createWorkCard(work) の中で、work.views が 100 以上なら classList.add("featured") を付ける
  3. renderWorks(list) を書く。最初に .work-list を textContent = "" で空にしてから、公開ぶんだけを append する
  4. cards を使っていた第58回から第60回の処理を消し、HTML パネルの article.work-card 3 つも消す

ヒント

`createWorkCard` は第62回のものをそのまま使えます。`views` の条件を 1 つ足すだけです

空にするのは `workList.textContent = "";` です。これを書けば HTML の 3 枚も一緒に消えます

HTML からカードを消すと `querySelectorAll(".work-card")` は空になります。`cards[0]` を使う行が残っているとエラーで止まります

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

できているか

  • 作品カードが 5 枚描かれる
  • 1 枚目が配列の 1 件目になる
  • views が 100 以上の作品が強調される
  • 2 枚目の補足行が配列の値から描かれる
  • 非公開の作品は描かれない
  • 5 枚すべてに補足行がある
エディタを読み込んでいます