Vibe Coder

JavaScript 基礎:讓靜態畫面變成互動應用

JavaScript 負責網頁的互動行為,包含操作 DOM、監聽事件、呼叫 API 三大工作。前端最常見的錯誤幾乎都出在這裡,懂了 JavaScript 就能看懂 Console 的錯誤訊息,知道問題出在哪一行、該怎麼跟 AI 描述。
JavaScript 基礎:讓靜態畫面變成互動應用

JavaScript 基礎:讓靜態畫面變成互動應用

按鈕沒反應、資料沒更新、Console 一堆紅字,前端最多的 bug 都出在 JavaScript,不懂就完全無法排查。

React 的 useState、useEffect、事件處理,全部建立在 JavaScript 的基礎上,這篇先把操作 DOM、事件監聽、呼叫 API 這三件事練熟,之後看 React 才不會覺得是魔法。

你將學到什麼

JS 在前端做什麼

操作 DOM、監聽事件、呼叫 API、更新畫面,四件事說完前端邏輯。

操作 DOM 的常用寫法

取得元素、讀寫內容、加減 class,幾行就能記熟。

事件監聽

點擊、輸入、送出,回應使用者操作的起點。

非同步與 API 呼叫

async、await、fetch,前後端串接的核心語法。

JS 在前端做什麼

功能說明例子
操作 DOM讀取和修改頁面上的元素點擊後改變文字、隱藏或顯示元素
事件監聽回應使用者的點擊、輸入、捲動按下按鈕送出表單
呼叫 API用 fetch 向後端請求資料查詢天氣資料、送出訂單
更新畫面根據資料動態渲染內容搜尋結果即時更新

操作 DOM

// 取得元素
const btn = document.querySelector('.submit-btn')
const title = document.getElementById('main-title')

// 讀取和修改內容
const text = title.textContent // 讀取文字
title.textContent = '新的標題' // 修改文字
title.innerHTML = '<strong>粗體</strong>' // 修改 HTML

// 修改樣式
title.style.color = '#c04040'
title.style.fontSize = '24px'

// 加減 class
title.classList.add('highlight')
title.classList.remove('hidden')
title.classList.toggle('active') // 有就移除,沒有就加

事件監聽

const btn = document.querySelector('#submit-btn')

// 點擊事件
btn.addEventListener('click', function(event) {
  console.log('按鈕被點擊了')
  event.preventDefault() // 阻止表單預設送出行為
})

// 輸入框變化
const input = document.querySelector('#search')
input.addEventListener('input', (e) => {
  console.log('目前輸入:', e.target.value)
})
使用者點擊按鈕(觸發 click 事件)addEventListenercallback 執行操作 DOM畫面即時更新
從點擊到畫面更新,中間每一步都是 JavaScript 在跑。

非同步 JS 與 API 呼叫

前端呼叫後端 API 需要等待,JavaScript 用 async / await 處理這種「等待」。

// async function 可以在裡面 await
async function getWeather(city) {
  try {
    // fetch 發送請求,await 等待回應
    const response = await fetch(`/api/weather?city=${city}`)
    // 確認 HTTP 狀態碼正常
    if (!response.ok) {
      throw new Error(`HTTP 錯誤:${response.status}`)
    }
    // 解析 JSON 回應
    const data = await response.json()
    console.log(data) // { city: "Taipei", temp: 28 }
    return data
  } catch (error) {
    console.error('API 呼叫失敗:', error)
  }
}

// 呼叫這個 function
getWeather('Taipei')

讀懂 AI 生的 JS:常見模式

看到這個意思是
const x = 值宣告一個不會重新賦值的變數
let x = 值宣告一個可以重新賦值的變數
箭頭函式和 function 類似但語法更短,寫成小括號加箭頭再加大括號
array.map把陣列的每個元素轉換,回傳新陣列
array.filter篩選陣列,只保留條件為真的元素
JSON.stringify把 JS 物件轉成 JSON 字串
JSON.parse把 JSON 字串解析成 JS 物件
async / await處理非同步操作(API 呼叫、等待)
try / catch捕捉錯誤,防止程式崩潰
可選鏈 obj?.prop如果 obj 是 null 就回傳 undefined 而不是報錯
Console 是你的朋友遇到 JS 問題,第一步永遠是開開發者工具 Console 看錯誤訊息,第二步是用 console.log() 印出你懷疑有問題的變數值。這兩步能解決八成的前端問題。

練習:讀懂一段收合按鈕的邏輯

const btn = document.querySelector('#toggle-btn')
const content = document.querySelector('.content')

btn.addEventListener('click', () => {
  content.classList.toggle('hidden')
  btn.textContent = content.classList.contains('hidden')
    ? '顯示' : '隱藏'
})
試著自己說一次點擊 id 為 toggle-btn 的按鈕,會切換 class 為 content 的元素的 hidden 類別(有就移除、沒有就加),同時把按鈕文字改成「顯示」或「隱藏」,形成一個收合按鈕的效果。

下一步的練習:做一個有輸入框和查詢按鈕的頁面,點擊後用 fetch 呼叫你的天氣 API,把城市名稱和溫度顯示在頁面上,不只是印在 Console。輸入台北並點查詢,頁面上要出現台北的溫度和天氣描述,開發者工具的 Network 面板能看到成功的請求,狀態碼是兩百。

延伸學習

把這篇文章分享給需要的人FacebookLINEThreadsX

常見問答

const 和 let 有什麼不同?
const 宣告一個不會重新賦值的變數,let 宣告一個可以重新賦值的變數。AI 生成的程式碼預設會優先用 const,只有確定值會改變時才用 let。
async / await 是在做什麼?
async 宣告一個非同步函式,await 讓程式等待一個 Promise(例如 fetch 呼叫 API)完成後再往下執行,讓非同步的程式碼讀起來跟同步程式碼一樣直覺。
遇到前端問題應該先看哪裡?
先開開發者工具的 Console 面板,看有沒有紅色錯誤訊息,再用 console.log() 印出你懷疑有問題的變數值。這兩步就能解決八成的前端問題。
什麼是可選鏈 obj?.prop?
可選鏈是 JavaScript 的安全取屬性語法,如果 obj 是 null 或 undefined,就回傳 undefined 而不是直接拋出錯誤,常用來避免 Cannot read properties of null 這類錯誤。