bug解决——hexo插件冲突导致tocbot生成目录跳转异常
本文最后更新于:1 分钟前
¶问题说明
在使用hexo部署博客时,使用了fluid主题,该主题可以使用tocbot在右侧生成一个跳转的目录,如下:
为了使用更强的markdown渲染器,选择将hexo默认markdown渲染器的hexo-renderer-marked卸载,转而安装hexo-renderer-markdown-it,该渲染器支持在**<hi>标签上自动生成标题锚点,并自动生成标题id**,该标题id即可用于tocbot自动扫描,并为右侧的目录生成跳转链接,保证右侧目录的正确跳转
但为了在文章正文中插入目录(一般是开头),需要其他的插件的支持,考虑到markdown-it-toc-and-anchor现在已不再维护,其使用的markdown-it版本太低,故添加插件hexo-toc用于生成标题锚点和文章目录(标题锚点请在hexo-renderer-markdown-it和hexo-toc中二选一),该插件只需要在markdown文章中任意位置添加**<div class="tocStart">
但是,同时使用二者导致了一个特殊的bug,即右侧的tocbot目录的跳转只能回到文章页面的顶部,无法正确跳转到标题位置,通过浏览器的F12检查得知了其原因:
这里可以看到,<h3>目录并未像预期的那样生成id,而是添加了一个**<span>**标签,并在其中生成了标题id,这使得tocbot的扫描结果变成了如下的情况:
通过标题跳转的超链接标签<a title>中的href=“#”可知,tocbot生成的标题超链接只能回滚到页面顶部,无法跳转到指定的目录标题位置,而这正是因为标题id位于<span>标签,无法被tocbot获得所导致的,此时,只能通过tocbot中的标题锚点,即“¶”完成正确跳转
如果需要tocbot正常工作,标题处的html结构和tocbot的html结构应如下:
观察可知,在<h3>标签中生成了标题的id,而不是在一个span标签中,进而tocbot在扫描后可以在自动目录中正确生成对应的href链接,指向该标题id,此时的点击应能正确跳转
¶问题解决
在本人尝试了多种方法后,最终在github的issue区Content's link show 'undefine' · Issue #11 · YenYuHsuan/hexo-theme-beantech (github.com)中,看到了**fawks96**这位大佬的回复,并以此解决了问题:
这里的代码位于博客目录下的node_modules\hexo-toc\lib\filter.js文件内,打开后如下:
代码说明如下
1 |
|
从这里可以看出,hexo-toc在更新后直接移除了标题中的id和子元素中的超链接,改为添加<span>标签,这里没有考虑其他插件的工作过程和效果,因此最终导致了问题的发生
解决方法也很简单,直接修改源码(回滚版本),即可:
重新部署,可以看到其效果如上面的正确结构所示,且所有跳转均恢复正常
最后,附上我个人Blog中的**_config.yml的hexo-renderer-markdown-it和hexo-toc**配置:
1 |
|
如果同样使用fluid主题的话,注意主题配置文件**_config.yml的anchorjs**需要关闭:
1 |
|