當我想要「撈出我要的資料」,並且渲染到網頁上,該怎麼做呢?
html:
🎃 <ul></ul>
裡面是「空值」
1 | <h1>每個農場的“農夫名字”</h1> |
JS:
🎃 farms
陣列中,有兩個物件(兩個農場)
1 | var farms = [ |
我現在要做的是:「從farms
陣列中,依序撈出“農夫的名字”」,並渲染到網頁上
作法如下
🎃 先建立變數el
,用來選取'.list
:
var el = document.querySelector('.list');
🎃 建立變數farmLen
,來計算出「陣列中,共有幾筆資料」:
var farmLen = farms.length;
🎃 建立變數,先給它「空的字串」(後面會用到):
var str = '';
JS:
1 | var el = document.querySelector('.list'); |
for
迴圈
在「for
迴圈」裡面:
🎃 建立變數content
,來插入內容:
var content = '<li>'+ farms[i].farmer +'</li>';
🍋 <li></li>
裡面,依序帶入「農夫名字」: farms[i].farmer
🎃 把「變數content
」放入.list
裡面:
❌ 錯誤寫法:直接用el.innerHTML = content;
1 | for(var i=0; i<farmLen; i++){ |
😢 這樣是錯誤的:只有出現「第二個農夫的名字」:查理
🍋 只有出現「第二個農夫的名字」,原因為:
雖然,變數content
的確有跑兩次迴圈(第一個 & 第二個農夫的名字),但是 .innerHTML
在帶入「第一個農夫名字」後,要帶入「第二個農夫名字」前,會先把「第一個農夫名字」給清除掉(這是.innerHTML
的特性),所以,最後結果就只會出現「第二個農夫的名字」
.innerHTML
的特性:會先把「原本的資料都清除」之後,再帶入「新的資料」
✅ 正確寫法
🎃 用「變數str
」來「累加字串」: str+=content;
🍋 「變數str
」原本是「空的字串」,使用+=
來依序加入「兩筆變數content
的字串」
🍋 用console.log()
來看「變數str
」跑出的結果:
- 跑第一次迴圈時,印出
變數content
的「第一筆」資料 - 跑第二次迴圈時,印出
變數content
的「第一筆+第二筆」資料
JS:
1 | var farms = [ |
.innerHTML
🎃 跑完「for
迴圈」後,「變數str
」已經將「兩筆字串」都記錄起來了。現在,就可以插入到.list
裡面了: el.innerHTML = str;
‼️ 這裡的el.innerHTML = str;
不用寫在「for
迴圈裡面」,是因為:
🍋 跑完for
迴圈後,「變數str
」已經把「第一筆+第二筆」資料都記錄起來了(下圖的紅色箭頭處)
✅ 所以,在把「變數str
」掛到.list
上時,就不需要再跑「for
迴圈」了,寫在「for
迴圈」的外面即可
JS:
1 | var farms = [ |
😄 網頁上就會依序出現「兩個農夫的名字」了
完整 JS:
1 | var farms = [ |
要把「變數var str = '';
」建立在「for
迴圈“外面”」
我的 jsbin 範例
https://jsbin.com/peyigaq/edit?html,console,output
html:
1 | <h1>每個農場的“農夫名字”</h1> |
❌ JS 錯誤寫法
❌ JS 錯誤寫法:把「變數var str = '';
」建立在「for
迴圈“裡面”」
JS 這樣寫,會導致:插入到<ul></ul>
裡面的,就只有<li>查理</li>
而已
原因為:
1️⃣ 跑第一次「for
迴圈」時–>
- 「變數
str
」原本是「空的字串」 - 「變數
str
」+=<li>卡斯伯</li>
2️⃣ 跑第二次「for
迴圈」時–>
- 「變數
str
」又變回「空的字串」(因為又再跑了一次var str = '';
) - 「變數
str
」+=<li>查理</li>
😢 因此,跑完兩次「for
迴圈」後,最後在console.log(str);
看到的結果–>
「變數str
」就只有<li>查理</li>
而已
😢 因此,用.innerHTML
插入到<ul></ul>
裡面的,就只有<li>查理</li>
而已
JS:
1 | var farms = [ |
✅ JS 正確寫法
✅ JS 正確寫法:把「變數var str = '';
」建立在「for
迴圈“外面”」
JS 這樣寫:插入到<ul></ul>
裡面的,就會是<li>卡斯伯</li><li>查理</li>
原因為:
🍋 「變數str
」原本是「空的字串」 var str = '';
1️⃣ 跑第一次「for
迴圈」時–>
- 「變數
str
」 +=<li>卡斯伯</li>
2️⃣ 跑第二次「for
迴圈」時–>
- 「變數
str
」這時候是<li>卡斯伯</li>
- 「變數
str
」 又再 +=<li>查理</li>
😄 因此,跑完兩次「for
迴圈」後,最後在console.log(str);
看到的結果–>
「變數str
」會是<li>卡斯伯</li><li>查理</li>
😄 因此,用.innerHTML
插入到<ul></ul>
裡面的,就會是<li>卡斯伯</li><li>查理</li>
JS:
1 | var farms = [ |