讀懂既有 jQuery 並建立原生事件入口
修改檔案:script.js
完成後看見:querySelectorAll 與 addEventListener 只切換被點擊的 FAQ
CHAPTER 19 · PRACTICE WORKSPACE
能讀懂既有 jQuery FAQ,再將同一段行為遷移成原生 JavaScript,並維持單開、收合與 aria-expanded
TASK STATUS
修改檔案:script.js
完成後看見:querySelectorAll 與 addEventListener 只切換被點擊的 FAQ
修改檔案:script.js
完成後看見:原生版的視覺開關與 aria-expanded 永遠一致
修改檔案:script.js
完成後看見:開新題會關閉舊題,再點目前題可收合,aria 不殘留
WORKSPACE
先確認作品目前能做什麼、還缺什麼,再從 TASK-01 開始修改。
FOCUS TASK · TASK-01
比較:兩種 API 都能找到元素,但要先分清既有 jQuery 責任與要建立的原生入口。
現在做:在 checkpoint-1/script.js 暫時把 document.querySelectorAll(".faq-question") 改成 document.querySelectorAll(".faq-item"),重新整理後點 FAQ 內容區,觀察事件入口已不只鎖定按鈕;恢復 selector 後再點第二題確認只有目標 item 改變。
預期:改錯 selector 時,FAQ 內容區也可能觸發開合;恢復 .faq-question 後,只有按鈕 click 會切換目前 item,能說出 selector 決定事件入口的範圍。
證據:留下兩次操作紀錄:錯誤 selector 讓非按鈕區域也能觸發,恢復後只有 .faq-question 按鈕觸發;指出 document.querySelectorAll() 與 addEventListener() 各自負責什麼。
比較:事件 handler 要針對目前被點擊的 FAQ,不應把所有項目一起打開。
現在做:在 checkpoint-1/script.js 暫時把 const currentItem = button.closest(".faq-item") 改成 const currentItem = document.querySelector(".faq-item"),重新整理後點第二題,觀察錯誤版本仍只改第一題;恢復 closest() 後再點第二題確認目前項目正確。
預期:錯誤版本會把第二題的操作錯套到第一題;恢復 button.closest(".faq-item") 後,事件只切換被點擊的 FAQ,能說出 button 與 currentItem 的關係。
證據:留下點第二題時錯誤版本開第一題、修正後開第二題的前後紀錄,並指出 closest() 如何把事件入口帶回目前 FAQ item。
完成條件:DONE-01:querySelectorAll 與 addEventListener 只切換被點擊的 FAQ
LEGACY MAINTENANCE
本課使用 jQuery 3.7.1 維護分支示範。
不是,它是包裝常見 JavaScript 操作的函式庫。
不一定,本課定位是讀懂與維護既有網站。
不會,下一課使用原生 fetch。
CONTINUE
前往 Checkpoint 1,依要求完成「讀懂既有 jQuery 並建立原生事件入口」。
CHAPTER HANDOFF
接收第 18 章:保留事件 → state → render 的讀碼方法;本頁是獨立 FAQ 練習,不共用第 18 章 Timer HTML。
交給第 20 章:完成後要能指出 querySelectorAll、addEventListener、closest、classList、aria-expanded 與單開規則;第 20 章會在獨立 API 頁接上 fetch 與四種非同步狀態,不重做本頁事件/DOM 基礎。