如何让R Bookdown代码块中的超链接在新标签页打开?
给Bookdown bs4_book代码块内的超链接添加target="_blank"
完全可以通过JavaScript实现这个需求,下面是具体的实现方案:
核心JavaScript代码
document.addEventListener('DOMContentLoaded', function() { // 选中所有downlit代码块里的超链接 const codeBlockLinks = document.querySelectorAll('pre.downlit.sourceCode a'); codeBlockLinks.forEach(link => { // 添加新窗口打开属性 link.setAttribute('target', '_blank'); // 可选:添加安全属性,避免新页面劫持原页面 link.setAttribute('rel', 'noopener noreferrer'); }); });
代码解释
DOMContentLoaded事件:保证页面所有DOM元素加载完成后再执行操作,避免找不到目标元素。querySelectorAll('pre.downlit.sourceCode a'):精准匹配你提供的HTML结构中,代码块内的所有<a>标签,覆盖不同代码类型的代码块。setAttribute:给每个超链接添加target="_blank",实现点击新窗口打开;额外添加的rel="noopener noreferrer"是安全最佳实践,防止恶意页面利用window.opener获取原页面权限。
如何在Bookdown项目中使用
方法1:全局引入(推荐)
- 在项目根目录创建
assets/js文件夹,新建custom-code-links.js文件,将上面的JS代码粘贴进去。 - 修改项目的
_output.yml配置文件,在bs4_book的includes中添加该脚本:
bs4_book: includes: in_header: assets/js/custom-code-links.js
方法2:单个Rmd文件引入
如果只想在特定页面生效,可以在对应Rmd文件的任意代码块中添加:
```{r echo=FALSE, include=TRUE} htmltools::includeScript("assets/js/custom-code-links.js")
## 修改后的效果示例 原代码块中的超链接会被修改为: ```html <span class="kw"><a href="https://rdrr.io/r/base/library.html" target="_blank" rel="noopener noreferrer">library</a></span> <span class="op">(</span> <span class="va"><a href="https://github.com/duncanplee/CARBayes" target="_blank" rel="noopener noreferrer">CARBayes</a></span> <span class="op">)</span>
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

