Skip to content

沒有立場內容的課程,setTab() 對已移除的 #view-stance 解參考,「上課」分頁完全打不開 #3

Description

@fringmin

環境

main @ 0c327f7(framework 2.0.0),Chromium 141.0.7390.37 headless。 gym 課程本身有 3 條立場資料,所以原網站跑不會遇到;但用框架自帶的 make new-course 產生的骨架課程,第一次開就會中

現象

  • 載入時 console 拋 TypeError: Cannot set properties of null (setting 'hidden')
  • 點「上課」分頁後,首頁與課程都被藏起來,但上課頁沒有顯示出來,內容區整片空白 (畫面上只剩側欄的「學習進度 0/0」與「重設進度」)
  • 每點一次「上課」就再拋一次,上課模式等於死掉

重現

make new-course NAME=bugtest
COURSE=courses/bugtest make build
# 開 dist/bugtest/index.html

實測:

檢查點 | 結果 -- | -- 載入後 pageerror | Cannot set properties of null (setting 'hidden') #view-stance 節點數 | 0(已被移除) 點「上課」後 #view-home 可見 | false 點「上課」後 #main 可見 | false 點「上課」後 #view-player 可見 | false

根因

src/web/js/app.js 裡對 #view-stance 的兩個假設不一致:

init() 在沒有立場內容時把節點整個拿掉(app.js:718-724)

const stanceEl = $("#view-stance");
if (data.stance?.length) { } else {
stanceEl.remove();
$('.TabNav__item[data-tab="stance"]')?.remove();
}

setTab() 無條件解參考它(app.js:267)

$("#view-stance").hidden = tab !== "stance";

移除(:723)發生在第一次 setTab()(:757)之前,所以拋錯必然發生。 關鍵是拋錯的位置在下一行 $("#view-player").hidden = … 之前, 而 #view-player  index.html:133 預設帶 hidden——它永遠沒機會被取消隱藏。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions