概述
目前使用的 next 版本是 5.1.4 ,文章左側的目錄一直不能跳轉也不能展開,按網上的辦法一直沒法解決,今天自己琢磨了一陣總算搞定了。
由於發現遇到這個問題的人不少,特此總結一下。
一般分爲兩種情況:渲染錯誤和超鏈接亂碼。
一、渲染錯誤
1.問題描述
最典型的特徵就是目錄上的超鏈接爲 undefined
,或者點擊的時候報錯: Cannot read property 'replace' of null
。
前一情況 GitHub 中已有相應的 Issues:根據 markdown 生成的 TOC 錨點的內容是 undefined
這個情況一般是 markdown-it
渲染出錯,渲染時候把應該加在標題的錨點加到了標題內的 sapn 標籤裏,導致生成目錄的時候獲取不到對應的錨點。
比如原本 ##一級標題
應該是渲染成 <h2 id="一級標題">一級標題</h2>
,然後生成目錄的時候掃描所有 h2
標籤獲取 id 作爲鏈接,但是實際上 marked-it 渲染出來的是這樣的: <h2><span id="一級標題">一級標題</span></h2>
2.解決方案
方案一:調整渲染引擎
最直白的解決方案就是更換渲染引擎。
如果一定要使用 markdown-it
的話,可以爲 markdown-it
安裝 markdown-it-named-headings
插件。具體的過程可以參考 markdown-it
的 Issues:Cannot render headings with ids?
方案二:修改代碼
如果安裝插件仍然不行,那就只能手動更改目錄渲染的 js 代碼,具體過程可以參考這個大佬的:Hexo 博客踩坑。
二、超鏈接亂碼
1.問題描述
這個問題的特徵是渲染沒問題,也就是不會有上面那種情況,但是點擊目錄鏈接會在控制檯報錯:Cannot read property 'top' of undefined
。
我們打開控制檯,查看目錄的的超鏈接標籤,會看到 href 是一串亂碼:
我們去找他對應的標題:
實際上直接點擊這個超鏈接是可以跳轉的,但是點目錄卻不行。這是因爲標題 id 是中文,但是目錄的連接是中文亂碼,代碼裏頭的 JQuery 選擇器拿着亂碼是沒法找到對應 id 的標題的。
2.解決方案
這個錯誤很明顯,因爲控制檯已經告訴我錯誤代碼在 post-details.js
裏了,順着提示找到 themes\next\source\js\src\post-details.js
,找到第 73 行爲目錄綁定點擊事件的方法,會看到:
targetSelector
就是對應標題的 id,我們在他被塞到選擇器之前重新編碼一下:
// 對獲取到的url進行重編碼
targetSelector = decodeURI(this.getAttribute('href'))
然後 hexo clean && hexo g && hexo s
重新跑一下,發現目錄就正常了。
另外,在next6 裏這個問題被修復了:點擊文章中文目錄跳轉無法實現 #1547。