讀懂既有 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;先核對可見結果,再前往 TASK-02。
FOCUS TASK · TASK-02
比較:class 控制外觀,aria-expanded 告訴輔助技術狀態;兩者要同時更新。
現在做:在 checkpoint-2/script.js 暫時註解 button.setAttribute("aria-expanded", String(willOpen)),重新整理後點同一題,觀察 class 已改變但 aria-expanded 仍是 false;恢復這行後再次展開與收合。
預期:移除 setAttribute 時,視覺開關與 aria-expanded 會分離;恢復後兩者每次都同步,能說出 class 是外觀狀態、aria-expanded 是可及性狀態。
證據:截圖或口述缺少 setAttribute 時的 class/aria 差異,以及恢復後 true/false 轉換;明確指出兩份證據如何互相對照。
比較:aria-expanded 需要可讀的 true/false 狀態,不能只靠 class 名稱猜測。
現在做:在 checkpoint-2/script.js 暫時把 String(willOpen) 改成 String(!willOpen),重新整理後展開與收合同一題,觀察 aria-expanded 顯示與 class 相反;恢復原值後再重跑同一操作。
預期:錯誤字串會讓輔助技術收到相反狀態;恢復 String(willOpen) 後,展開是 true、收合是 false,不能只靠 class 名稱猜測。
證據:留下展開與收合各一次的 class/aria 對照,證明錯誤字串造成相反狀態,恢復後 true/false 與畫面一致。
完成條件:DONE-02:原生版的視覺開關與 aria-expanded 永遠一致
LEGACY MAINTENANCE
本課使用 jQuery 3.7.1 維護分支示範。
不是,它是包裝常見 JavaScript 操作的函式庫。
不一定,本課定位是讀懂與維護既有網站。
不會,下一課使用原生 fetch。
CONTINUE
前往 Checkpoint 2,依要求完成「在原生事件中同步 aria-expanded」。
CHAPTER HANDOFF
接收第 18 章:保留事件 → state → render 的讀碼方法;本頁是獨立 FAQ 練習,不共用第 18 章 Timer HTML。
交給第 20 章:完成後要能指出 querySelectorAll、addEventListener、closest、classList、aria-expanded 與單開規則;第 20 章會在獨立 API 頁接上 fetch 與四種非同步狀態,不重做本頁事件/DOM 基礎。