🕹️
DOM操作
1週間 初心者JavaScriptからHTMLの要素を操作し、ページを動的に書き換える。
概要
これは何?
DOM(Document Object Model)は、HTMLの要素をJavaScriptのオブジェクトとして扱う仕組みです。
なぜ重要?
DOMを操作できなければ、ページの変化を起こせません。Reactなどの土台となる重要な知識です。
何を学ぶか
- 要素の取得
- イベントリスナー
- クラスやスタイルの変更
- 要素の生成と削除
詳細解説
要素の取得
HTML上にある要素をJSの世界に持ってきます。idで1つ取得するか、querySelectorでCSSセレクタのように取得します。
例:
- document.getElementById('msg')
- document.querySelectorAll('li')
Tips:
- querySelectorAllは配列のようにforEachで回せる
よくある間違い:
- 取得できていない(null)のに操作しようとしてエラーになる
イベント(クリック時の処理等)
「ボタンが押された」「文字が入力された」などのタイミングで処理を走らせることをイベントリスナーと言います。
例:
- btn.addEventListener('click', () => {\n console.log('押された');\n})
Tips:
- 要素の一覧(ulなど)に1つだけリスナーを付ける「イベントデリゲーション」という応用テクニックがある
要素の書き換え・追加・削除
textContentで文字を変え、classList.addでCSSクラスを追加します。新しく箱を作る場合はcreateElement、消す場合はremoveを使います。
例:
- el.textContent = 'Hello'
- el.classList.add('active')
- el.remove()
Tips:
- クラスを変えてCSSのtransitionと組み合わせるとアニメーションになる
よくある間違い:
- innerHTMLで入力をそのまま表示してセキュリティの穴(XSS)を作る
実践手順
- 1 HTML要素を取得する 2分
JSからHTMLの要素を操作するため、まずは要素をプログラムの世界に引っ張ってきます。
- 操作したい要素に id="target" を付ける
- document.getElementById で取得して変数に入れる
<!-- HTML側 --> <p id="target">古いテキスト</p> <script> const el = document.getElementById('target'); console.log(el); </script> - 2 文字や見た目を書き換える 3分
取得した要素の中身やスタイルを直接書き換えます。
- textContent プロパティで文字を変更
- style プロパティで文字色を変更
<script> const el = document.getElementById('target'); el.textContent = '新しいテキストに変わりました!'; el.style.color = 'red'; </script> - 3 クリックイベントを作る 5分
ボタンが押された瞬間に処理を走らせる、最も使う仕組みを作ります。
- button要素を用意しidを付与
- addEventListener で 'click' イベントを監視する
- クリックされたらアラートを出す
<button id="btn">クリック</button> <script> const btn = document.getElementById('btn'); btn.addEventListener('click', () => { alert('ボタンが押されました!'); }); </script>
よくある質問
- innerHTML使うなって怒られた…textContentと何が違うの?
- textContentは入力された文字をただの安全な文字として出すんだけど、innerHTMLは「HTMLタグ」として実行しちゃう。つまり、悪意あるユーザーが入力欄にウイルスみたいなスクリプト書いたらそのまま発動しちゃう(XSS攻撃)ってわけ。超キケン。
- JSで新しく追加したボタンをクリックしても反応しない!
- addEventListener 書いた時点では、まだそのボタンが存在してなかったからスルーされちゃった説が濃厚。こういう時は「親要素」にイベントくっつけておいて、中身(e.target)が新ボタンだったら発動させる「イベントデリゲーション」って技を使います。
- querySelectorAllで取った一覧にmap()使ったらエラー出た
- それ、見た目は配列([div, div, div]みたいな)なんだけど、実は NodeList っていう配列の偽物なんです!forEachは使えるけどmapは使えません。Array.from(nodeList) って書いて本物の配列にジョブチェンジさせると使えますよ!
① 解説を読んだ。次は② 演習する。
JSでページを動かせるようになりました。
次はレイアウトを学び、見た目も本格的にしましょう。