當我想要「撈出我要的資料」,並且渲染到網頁上,該怎麼做呢?
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 = [ |