【從零開始學JavaScript】實作練習 - 分類型Menu(上)
Menu
前言
- 由於此次練習需要較多的說明與介紹,故分作上下兩篇。
- 在JavaScript中,有個名為
menu的陣列(如下),用來記錄所有的食物資訊。1
2
3
4
5
6
7
8
9
10
11const menu = [
{
id: 1, //編號
title: "buttermilk pancakes", //食物名稱
category: "breakfast", //食物類別
price: 15.99, //價格
img: "./images/item-1.jpeg", //圖片連結
desc: `I'm baby woke mlkshk wolf bitters live-edge blue bottle, hammock freegan copper mug whatever cold-pressed `, //說明
},
...
};
功能說明

- 標題
- 類別按鈕 :
- 我們的目標並非直接在HTML利用
<button>...</button>來手動新增按鈕,而是在JavaScript中利用函式來自動生成按鈕。此舉動可以讓我們在以後如果要新增新的食物,但其類別也是新的,就可以直接在menu陣列中新增資料,而不用特別去HTML檔中手動新增。
- 我們的目標並非直接在HTML利用
- 食物清單
HTML重點
- 主框架 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19<section class="menu">
<!-- 標題 -->
<div class="title">
<h2>Our Menu</h2>
<div class="underline"></div>
</div>
<!-- 類別按鈕 -->
<div class="btn-container">
<!-- 內容於JavaScript中生成 -->
</div>
<!-- 食物清單 -->
<div class="section-center">
<!-- 內容於JavaScript中生成 -->
</div>
</section> - 重點 :
- 將類別按鈕的Class設為
btn-container - 將食物清單的Class設為
section-center
- 將類別按鈕的Class設為
JavaScript重點
利用
class="btn-container"去抓取類別按鈕的div元素1
const container = document.querySelector('.btn-container');
利用
class="section-center"去抓取食物清單的div元素1
const sectionCenter = document.querySelector('.section-center');
新增
displayMenuItems()函式 : 在畫面顯示出食物清單1
2
3function displayMenuItems(menuItems){
// Details...
};- 下列的程式碼都在
displayMenuItems()之內 menuItems為輸入的陣列
- 下列的程式碼都在
新增
displayMenu陣列 : 儲存食物清單表現方式的HTML碼1
2
3
4
5
6
7
8
9
10
11
12let displayMenu = menuItems.map(function(item){
return `<article class="menu-item">
<img src="${item.img}" class="photo" alt=${item.title}">
<div class="item-info">
<header>
<h4>${item.title}</h4>
<h4 class="price">$${item.price}</h4>
</header>
<p class="item-text">${item.desc}</p>
</div>
</article>`;
});上面所提的HTML碼,若以單一食物為例 :
1
2
3
4
5
6
7
8
9
10<article class="menu-item">
<img src="./images/item-1.jpeg" class="photo" alt= buttermilk pancakes">
<div class="item-info">
<header>
<h4>buttermilk pancakes</h4>
<h4 class="price">$15.99</h4>
</header>
<p class="item-text">I'm baby woke mlkshk wolf bitters live-edge blue bottle, hammock freegan copper mug whatever cold-pressed</p>
</div>
</article>- 結果 :

- 結果 :
Array.map()需要回傳一個值,它會把原始的陣列運算後重新組合一個新的陣列 :- 如果不回傳則是
undefined - 回傳數量等於原始陣列的長度
- 在回傳的值中,可以塞入
${原始陣列的key},回傳時便會隨著陣列中不同物件而回傳不同的值
- 如果不回傳則是
最後,
displayMenu陣列將會呈現如下圖所示 :

利用
Array.join()將陣列串聯起來1
displayMenu = displayMenu.join("");
Array.join()會將陣列中所有的元素連接、合併成一個字串,並回傳此字串。- 參數 : 用來隔開陣列中每個元素的字串。舉例中參數為” “,代表
displayMenu的所有元素將會用一格空白來串接
- 參數 : 用來隔開陣列中每個元素的字串。舉例中參數為” “,代表
- 此時的
displayMenu會從Array轉變成String,這也是為何在宣告displayMenu時要用let的原因。宣告變數的詳細介紹,請見【02】宣告變數注意重點
將
displayMenu設為食物清單DIV的內容碼1
sectionCenter.innerHTML = displayMenu;
HTMLDOMObject.innertHTML: 可以取得或設定 HTML Code 中的元素,也可以單純的將字串寫入 HTML Code 的某一個部分。詳情請見參考來源。
設定在網頁被讀入時,自動顯示所有內容(回到最外層)
1
2
3window.addEventListener('DOMContentLoaded',function(){
displayMenuItems(menu);
});window.addEventListener()的詳細介紹,請見【06】網頁練習 - 按鈕翻頁
參考與引用來源
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Robin's Tech Blog!


