AIで学ぶJavaScript基礎
AIでウェブサイトにインタラクティビティを追加——DOM操作、イベントハンドリング、フォームバリデーション、バニラJavaScriptによる動的コンテンツ更新。
プレミアムコースコンテンツ
このレッスンはプレミアムコースの一部です。Proにアップグレードすると、すべてのプレミアムコースとコンテンツを利用できます。
- すべてのプレミアムコースを利用
- 1,000以上のAIスキルテンプレート付き
- 毎週新しいコンテンツを追加
🔄 Quick Recall: 前のレッスンでは、CSSでページをスタイリングした——レスポンシブレイアウト、デザイントークン、ダークモード。次はJavaScriptでインタラクティブに。
DOM操作
DOM(Document Object Model)はJavaScriptがHTMLとやりとりする仕組み。一般的なDOMタスクにAIを活用する方法:
要素の選択と変更
バニラJavaScriptで以下を実行するコードを書いてください:
1. id="hero-title"の要素を選択してテキストを変更
2. class="card"のすべての要素を選択し、最初のものに"featured"クラスを追加
3. 新しいp要素を作成、テキストを設定し、id="content"の要素に追加
要件:
- document.querySelectorとdocument.querySelectorAllを使用(getElementByIdではなく)
- 安全なテキスト更新にtextContentを使用
- 外部ライブラリなし
- 各ステップにコメントを追加
動的コンテンツ生成
配列からアイテムリストを動的に生成するバニラJavaScriptを作成:
データ:
const items = [
{ title: "Item 1", description: "Description 1", category: "A" },
{ title: "Item 2", description: "Description 2", category: "B" },
// ... 追加アイテム
];
要件:
- ul要素を作成
- 各アイテムについて、strongタグのタイトルとpの説明を含むliを作成
- 完成したリストをid="item-list"の要素に追加
- 安全なDOM更新にdocument.createElementとtextContentを使用
- パフォーマンスのためdocument fragmentを使用(DOMへの一括挿入)
バニラJavaScriptのみ、依存なし。
✅ Quick Check: 複数の要素を作るときにdocument fragmentを使う理由は?
ページに要素を追加するたびにブラウザがレイアウトを再計算する。50個のアイテムを1つずつ追加すると50回の再計算。document fragmentは見えないコンテナ——中にすべてを組み立て、一度だけ追加する。50回の代わりに1回の再計算。AIは書きやすい1つずつのアプローチを生成することがあるが、リストが大きくなるとパフォーマンスの差が出る。
イベントハンドリング
クリックイベントとイベント委譲
インタラクティブなFAQアコーディオンのバニラJavaScriptを作成:
HTML構造:
- 複数のFAQ項目、各項目に質問(button)と回答(div)
- 質問クリックで回答の表示/非表示を切り替え
- 一度に1つの回答だけ開く(アコーディオン動作)
要件:
- イベント委譲を使用(各ボタンに1つではなく、親コンテナに1つのリスナー)
- ボタンのaria-expandedをトグル
- 回答divの"hidden"クラスをトグル
- CSSクラス切り替えでスムーズな高さトランジション
- キーボードアクセシブル(EnterとSpaceでトグル発動)
バニラJavaScript、依存なし。HTML構造も含めて出力。
フォームバリデーション
バニラJavaScriptでクライアントサイドのフォームバリデーションを作成:
フォームフィールド:
- 名前(必須、最低2文字)
- メール(必須、有効なメール形式)
- 電話(任意、入力があれば電話番号パターンに合致)
- メッセージ(必須、最低10文字、最大500文字)
バリデーション動作:
- フォーム送信時にバリデーション
- 各無効フィールドの下にtextContentでエラーメッセージを表示(生HTMLの注入は絶対にしない)
- アクセシビリティのためaria-invalidとaria-describedbyを使用
- 無効なフィールドがあればフォーム送信を阻止
- ユーザーが修正し始めたらエラーメッセージをクリア(inputイベント)
- フォームが有効ならサクセスメッセージを表示
バニラJavaScript、依存なし。
localStorageの活用
シンプルなお気に入り/ブックマーク機能のバニラJavaScriptを作成:
動作:
- 各カードにハート/スターボタン
- ボタンクリックでアイテムのお気に入りをトグル
- お気に入りをlocalStorageに保存
- ページロード時に以前のお気に入り状態を復元
- 「お気に入りだけ表示」フィルターで絞り込み
要件:
- localStorageにアイテムIDの配列を保存(JSON.stringify/parse)
- localStorageが利用不可の場合に対応(try-catch)
- お気に入り状態に応じてボタンの視覚状態を更新(塗り/枠線)
- トグルボタンにaria-pressed属性を含める
バニラJavaScript、依存なし。
✅ Quick Check: localStorageが利用不可の場合に備える理由は?
localStorageは常に使えるわけではない。プライベート/シークレットブラウジングモードではブロックされることがある。ストレージが満杯だとブラウザが無効にする。企業のファイアウォールが制限する場合もある。localStorage.setItem()が常に動くと想定すると、1回のブロックですべてが壊れる。try-catchでlocalStorage操作を囲めば、ページは動き続ける——セッション間でお気に入りを覚えないだけだ。
AI生成JavaScriptのセキュリティレビュー
AI出力は常にこれらの一般的な脆弱性をチェック:
このJavaScriptのセキュリティ問題をレビュー:
[JavaScriptを貼り付け]
確認項目:
1. サニタイズされていないユーザーデータのDOM挿入(XSSリスク)
2. 動的コード実行パターン(コードインジェクションリスク)
3. バリデーションなしのURLパラメータ使用
4. localStorageに暗号化なしで保存された機密データ
5. フォームデータの入力サニタイズ不足
6. 悪意を持ってトリガーされうるイベントハンドラー
7. クライアントサイドコードにハードコードされたAPIキーやシークレット
各問題について、リスクの説明と安全な代替策を提供。
演習:ページにインタラクティビティを追加
- イベント委譲を使ったFAQアコーディオンを追加
- クライアントサイドバリデーション付きフォーム(4フィールド以上)を作成
- localStorage永続化のお気に入り機能を実装
- すべてのJavaScriptにセキュリティレビュープロンプトを実行
- キーボードナビゲーションをテスト——マウスなしですべての機能が使えるか?
Key Takeaways
- プロンプトに「バニラJavaScript、依存なし」を常に指定し、どのブラウザでも動く互換性のあるコードを得る
- 安全なテキスト更新に
textContentを使い、HTMLコンテンツはDOMに挿入する前にサニタイズする - イベント委譲(親に1つのリスナー)は各要素に個別リスナーより効率的で保守しやすい
- document fragmentでDOM挿入を一括化し、動的コンテンツのパフォーマンスを改善
- localStorage、API呼び出し、JSONパースはtry-catchで囲む——外部操作の成功を前提にしない
- AI生成JavaScriptは常にセキュリティレビューを実行し、サニタイズされていないユーザーデータとハードコードされたシークレットを確認する
Up Next: 次のレッスンでは、インタラクティブ機能の構築と外部API連携——データの取得、レスポンス処理、動的ウェブアプリケーションの作成。
理解度チェック
まず上のクイズを完了してください
レッスン完了!