如何解決next5主題目錄無法跳轉的問題

概述

目前使用的 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 是一串亂碼:

image-20201217163920205

我們去找他對應的標題:

image-20201217164207627

實際上直接點擊這個超鏈接是可以跳轉的,但是點目錄卻不行。這是因爲標題 id 是中文,但是目錄的連接是中文亂碼,代碼裏頭的 JQuery 選擇器拿着亂碼是沒法找到對應 id 的標題的。

2.解決方案

這個錯誤很明顯,因爲控制檯已經告訴我錯誤代碼在 post-details.js裏了,順着提示找到 themes\next\source\js\src\post-details.js,找到第 73 行爲目錄綁定點擊事件的方法,會看到:

image-20201217170155109

targetSelector就是對應標題的 id,我們在他被塞到選擇器之前重新編碼一下:

// 對獲取到的url進行重編碼
targetSelector = decodeURI(this.getAttribute('href'))

然後 hexo clean && hexo g && hexo s 重新跑一下,發現目錄就正常了。

另外,在next6 裏這個問題被修復了:點擊文章中文目錄跳轉無法實現 #1547

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章