一、问题现象
在 Discourse 论坛中,默认情况下:
- 点击站内链接(帖子、分类、用户页面)-> 当前标签页跳转
- 点击站外链接 → 也是当前标签页跳转
对于习惯了"外部链接新窗口打开"的用户来说,这确实很不方便------看到感兴趣的链接一点,论坛页面就没了。
不过需要说明的是,Discourse 这样设计是有原因的。屏幕阅读器用户(视障人士)最反感链接突然在新标签页打开,因为他们无法预知页面变化。Discourse 选择尊重用户的选择权,而不是强行设定行为。
二、解决方案(三种方法,从简单到进阶)
方法一:用户个人设置(最简单,仅对自己有效)
Discourse 其实是支持新标签页打开外部链接的,只是默认没开启而已。
操作步骤:
- 点击论坛右上角的头像 → 进入个人偏好设置
- 找到 界面 选项卡
- 找到 在新标签页中打开所有外部链接 这个选项,勾选它
- 刷新页面即可生效
这是官方建议的方式,尊重用户自己的选择------想在新标签页开的就打开,不想开的就保持默认。
局限性 :这个设置只对你自己生效,不能帮你的论坛用户解决问题。如果你想让所有用户都默认在新标签页打开,需要用下面的方法。
方法二:全局设置(对所有用户生效)
如果你是论坛管理员,可以通过修改设置让所有用户的默认行为改变。
操作步骤:
- 进入后台:
/admin - 点击 Settings → 搜索
external links in new tab - 找到
external_links_in_new_tab这个设置项 - 把它开启(设为
true)
开启后,所有用户的外部链接都会在新标签页打开。而且用户仍然可以在自己的偏好设置里覆盖这个默认行为------既统一了体验,又保留了个人选择权。
方法三:主题组件方法(管理员,可定制)
如果上面的全局设置无法满足你的需求(比如你想让某些链接在新标签页、某些在原标签页),可以通过创建一个主题组件来完全控制。
这个方法适合有代码基础的管理员,可以实现比原生设置更精细的控制。
操作步骤:
- 进入后台:Admin → Customize → Theme Components → 点击 Create
- 给组件命名,比如
Open External Links In New Tab - 进入组件的 Edit Code 界面,找到 JavaScript 选项卡
- 粘贴以下代码:
javascript
import { apiInitializer } from “discourse/lib/api”; export default apiInitializer(“1.8.0”, (api) => { api.decorateCookedElement( (element) => { element.querySelectorAll(“a[href^=‘http’]”).forEach((link) => { // 判断是否为外部链接 if (link.hostname !== window.location.hostname) { link.target = “_blank”; link.rel = “noopener noreferrer”; } }); }, { id: “external-links-new-tab” } ); });
- 保存后,把这个组件应用到你的当前主题上
这段代码的原理是:遍历帖子中的所有链接,如果链接的域名和当前页面不一样,就给它加上 target="_blank" 属性,强制在新标签页打开。
rel="noopener noreferrer"是什么? 这是安全相关的属性,防止新打开的页面通过window.opener操控你的原页面,同时避免泄露来源信息。
三、额外的增强方案:油猴脚本
如果你的需求不只是简单的"外部链接新标签页",而是想要更智能的控制,比如:
- 在帖子列表中直接中键/后台打开多个帖子
- 控制帖内链接的打开方式
- 解决论坛本身的一些限制
可以试试这个油猴脚本:Discourse 新标签页 (Greasy Fork 上有)。
这个脚本是社区开发者 @selakyselaky 制作的,可以自动识别 Discourse 论坛,让帖子链接在后台新标签页打开,不用手动按住 Ctrl 或中键点链接了。
脚本的功能特点:
| 场景 | 行为 |
|---|---|
| 从任意页面打开主题帖 | 新标签页打开 |
| 在主题帖内部点击其他链接 | 新标签页打开 |
| 从任意页面打开用户主页 | 新标签页打开 |
| 打开图片等附件 | 保留原生跳转方式 |
脚本作者提到一个需要注意的地方:“在主题帖内部点击其他链接时,用新标签页打开” 这条规则可能与某些功能(如聊天窗口)冲突,如果遇到问题可以在脚本设置中关闭这条规则。
四、帖子中插入链接的注意事项
4.1 保证外部链接新窗口打开
如果你想在写帖子的时候就强制某个外部链接在新窗口打开,可以用 HTML 语法:
html
这样写出来的链接,不管用户怎么设置,都会在新标签页打开。
4.2 识别问题:URL 不要直接贴在文字后面
Discourse 会自动把帖文中的 URL 识别为超链接,但如果你这样写:
text
系统会把"是一个网站链接"也当成 URL 的一部分,导致超链接错误。
正确写法 :在 URL 和后面的文字之间加空格,或者用尖括号包裹 URL:
text
https://example.com 是一个网站链接。
这样系统就能准确识别 URL 的边界了。
五、总结
| 方法 | 适用人群 | 生效范围 | 难度 |
|---|---|---|---|
| 个人偏好设置 | 普通用户 | 仅自己 | |
| 后台全局设置 | 管理员 | 全站用户 | |
| 主题组件 | 管理员(有代码能力) | 全站用户 | |
| 油猴脚本 | 普通用户(装插件) | 仅自己 | |
| HTML 手动写链接 | 发帖用户 | 仅当前帖子 |
最推荐的方案 :
- 如果你是普通用户 :去个人偏好设置里勾选"在新标签页中打开所有外部链接"
- 如果你是论坛管理员 :去后台开启
external_links_in_new_tab全局设置
两个操作加起来不超过 1 分钟,就能解决你的问题。