前回まで
次は、プラン作成編です。
ステップ1|InfoWindow に「プランメモに追加」ボタンを追加しよう
現在の InfoWindow を確認しよう
現在script.js を見ると、InfoWindow は spots.forEach の中と showMarkers 関数の中の
2箇所に書かれているかと思いますので、両方にボタンを追加する必要があります。
現在の content はこうなっています。
content: `<p>${spot.name}</p><p>${spot.description}`,
やってみよう
- この
contentの中に「プランメモに追加」ボタンを追加してみましょう -
idをつけておくと、あとでボタンを取得しやすくなります
参考:template literal の中に HTML を追加する書き方
content: `
<p>テキスト</p>
<button id="任意のid名">ボタン</button>
`,
ステップ2|プランメモを管理するファイルを用意しよう
memo.js を新規作成しよう
ホーム画面とプラン作成画面の両方でメモデータを使います。
spots.js と同じように別ファイルに切り出して管理しましょう。
やってみよう
-
memo.jsを新規作成して、メモを管理する空の配列を定義しましょう -
index.htmlでspots.jsの下に読み込みを追加しましょう
参考:複数の JS ファイルを読み込む順番
<script src="./spots.js"></script>
<script src="./memo.js"></script> <!-- spots.js の後、script.js の前 -->
<script src="./script.js"></script>
⚠️
script.jsの中でメモの配列を使うので、script.jsより前に読み込む必要があります
ステップ3|ボタンを押したらメモに追加しよう
domready イベントを使おう
InfoWindow 内のボタンは、吹き出しが表示されてから DOM に追加されます。
通常の addEventListener では取得できないため、domready という専用のイベントを使います。
参考:domready の書き方
google.maps.event.addListener(infoWindow, 'domready', () => {
// 吹き出しが表示されてから実行される
document.getElementById('ボタンのid').addEventListener('click', () => {
// ここにメモ追加の処理を書く
});
});
やってみよう
-
domreadyの中でボタンを取得して、クリックしたらメモの配列にスポットを追加しましょう -
console.logでメモの配列に追加されているか確認しましょう - 同じスポットが二重に追加されないようにチェックも入れましょう
ヒント:配列の中に同じデータがあるか調べる
配列.find(item => item.name === 調べたい名前)
// 見つかればそのデータが、見つからなければ undefined が返る
⚠️
domreadyの処理はspots.forEachの中とshowMarkers関数の中の
両方に追加してください。絞り込みでピンが再描画されたあとも動くようにするためです。
ステップ4|メモを LocalStorage に保存しよう
ページをまたいでもデータを保持しよう
ホーム画面で追加したメモを plan.html でも使うため、localStorage に保存します。
メモに追加するたびに保存し直すようにしましょう。
参考:配列を localStorage に保存・読み込みする書き方
// 保存(配列は文字列に変換してから保存する)
localStorage.setItem('キー名', JSON.stringify(配列));
// 読み込み(文字列を配列に戻す)
const data = JSON.parse(localStorage.getItem('キー名'));
やってみよう
- メモに追加するたびに
localStorageに保存するようにしましょう - 開発者ツール → Application → Local Storage を開いて保存されているか確認しましょう
ステップ5|プラン作成画面へ遷移するボタンを追加しよう
index.html にボタンを追加しよう
.plan エリアやヘッダーなど、わかりやすい場所にボタンを置きましょう。
参考:ボタンを押したら別ページへ移動する書き方
location.href = '移動先のファイル名.html';
やってみよう
-
index.htmlにボタンを追加して、plan.htmlへ移動できるようにしましょう - まだ
plan.htmlがないので「ページが見つかりません」になります。次のステップで作ります
ステップ6|プラン作成画面(plan.html)を作ろう
plan.html を新規作成しよう
index.html と同じフォルダに plan.html を作ります。
やってみよう
-
detail.htmlを参考に HTML の基本構造を書きましょう(ヘッダーはコピーしてくる) - 以下の要素を置きましょう
- メモ一覧を表示するエリア(空の
div) - 「プランを作成する」ボタン
- 「← ホームに戻る」ボタン
- メモ一覧を表示するエリア(空の
-
spots.jsと新しく作るplan.jsを読み込みましょう
⚠️
memo.jsはplan.htmlでは読み込まなくて大丈夫です。
メモデータはlocalStorageから取得するのでplan.js側で処理します。
ステップ7|プランメモの一覧を表示しよう
plan.js を新規作成しよう
plan.html 専用の JS ファイルです。
localStorage からメモを読み込んで画面に一覧表示します。
参考:localStorage にデータがないときの初期値の書き方
const saved = localStorage.getItem('キー名');
const data = saved ? JSON.parse(saved) : []; // 保存がなければ空配列にする
参考:要素を動的に生成して追加する書き方
const card = document.createElement('div');
card.className = 'クラス名';
card.innerHTML = `表示したいHTML`;
document.querySelector('追加先').appendChild(card);
やってみよう
-
localStorageからメモを読み込んで、スポット名などをカードで表示しましょう - メモが 0 件のときは「ホーム画面でスポットをメモに追加してください」と表示しましょう
ステップ8|スポットを選択できるようにしよう
カードをクリックしたら選択状態にしよう
style.css にはすでに .select-button.active のスタイルがあります。
同じように .memo-card.active のスタイルを追加して、選択中がわかるようにしましょう。
参考:クリックのたびにクラスをつけたり外したりする書き方
要素.classList.toggle('クラス名');
やってみよう
-
style.cssに.memo-card.activeのスタイルを追加しましょう - カードをクリックするたびに見た目が切り替わることを確認しましょう
ステップ9|3〜5箇所の選択数をチェックしよう
作成ボタンを押したとき選択数を確認しよう
参考:active クラスがついている要素の数を取得する書き方
const selected = document.querySelectorAll('.クラス名.active');
const count = selected.length;
参考:条件を満たさないとき処理を止める書き方
if (条件) {
alert('メッセージ');
return; // ここで処理を止める
}
やってみよう
- 2件以下のときは「3箇所以上選択してください」とアラートを出しましょう
- 6件以上のときは「5箇所以内で選択してください」とアラートを出しましょう
- 3〜5件のときは
console.logで選択されたスポット名を確認しましょう
ステップ10|プランを作成して LocalStorage に保存しよう
選択したスポットのデータをまとめて保存しよう
選択されたカードのスポット名をもとに、planMemo から該当データを取り出してプランを作ります。
作成済みのプランは追加していけるように配列で管理します。
参考:配列を別の形の配列に変換する書き方
const new配列 = 元の配列.map(item => 変換処理);
参考:既存の配列に新しいデータを追加して保存し直す流れ
// 1. 既存のデータを読み込む(なければ空配列)
const existing = JSON.parse(localStorage.getItem('キー名')) || [];
// 2. 新しいデータを追加する
existing.push(新しいデータ);
// 3. 丸ごと保存し直す
localStorage.setItem('キー名', JSON.stringify(existing));
やってみよう
- プランを保存したら
location.hrefでホーム画面に戻りましょう - 開発者ツールで
plansに複数のプランが保存されているか確認しましょう
ステップ11|ホーム画面にプランを複数表示しよう
script.js でプラン一覧を読み込んで表示しよう
localStorage から全プランを読み込んで .plan-content に表示します。
プランの中にスポットが入っているので、ループの中でさらにループする書き方になります。
参考:二重ループの書き方
外側の配列.forEach((内側の配列, index) => {
// プランごとの見出しなど
内側の配列.forEach(item => {
// スポットを1件ずつ表示する
});
});
やってみよう
- 「プラン1」「プラン2」のように番号つきの見出しをつけて表示しましょう
-
script.jsの末尾でこの関数を呼び出すことを忘れずに! - プランを複数作成して、ホーム画面に並んで表示されることを確認しましょう