解决Discourse超链接直接跳转问题

UID:3 一级用户组

一、问题现象

在 Discourse 论坛中,默认情况下:

  • 点击站内链接(帖子、分类、用户页面)-> 当前标签页跳转
  • 点击站外链接 → 也是当前标签页跳转

对于习惯了"外部链接新窗口打开"的用户来说,这确实很不方便------看到感兴趣的链接一点,论坛页面就没了。

不过需要说明的是,Discourse 这样设计是有原因的。屏幕阅读器用户(视障人士)最反感链接突然在新标签页打开,因为他们无法预知页面变化。Discourse 选择尊重用户的选择权,而不是强行设定行为。

二、解决方案(三种方法,从简单到进阶)

方法一:用户个人设置(最简单,仅对自己有效)

Discourse 其实是支持新标签页打开外部链接的,只是默认没开启而已。

操作步骤:

  1. 点击论坛右上角的头像 → 进入个人偏好设置
  2. 找到 界面 选项卡
  3. 找到 在新标签页中打开所有外部链接 这个选项,勾选它
  4. 刷新页面即可生效

这是官方建议的方式,尊重用户自己的选择------想在新标签页开的就打开,不想开的就保持默认。

局限性 :这个设置只对你自己生效,不能帮你的论坛用户解决问题。如果你想让所有用户都默认在新标签页打开,需要用下面的方法。

方法二:全局设置(对所有用户生效)

如果你是论坛管理员,可以通过修改设置让所有用户的默认行为改变。

操作步骤:

  1. 进入后台:/admin
  2. 点击 Settings → 搜索 external links in new tab
  3. 找到 external_links_in_new_tab 这个设置项
  4. 把它开启(设为 true

开启后,所有用户的外部链接都会在新标签页打开。而且用户仍然可以在自己的偏好设置里覆盖这个默认行为------既统一了体验,又保留了个人选择权。

方法三:主题组件方法(管理员,可定制)

如果上面的全局设置无法满足你的需求(比如你想让某些链接在新标签页、某些在原标签页),可以通过创建一个主题组件来完全控制。

这个方法适合有代码基础的管理员,可以实现比原生设置更精细的控制。

操作步骤:

  1. 进入后台:Admin → Customize → Theme Components → 点击 Create
  2. 给组件命名,比如 Open External Links In New Tab
  3. 进入组件的 Edit Code 界面,找到 JavaScript 选项卡
  4. 粘贴以下代码:

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” } ); });

  1. 保存后,把这个组件应用到你的当前主题上

这段代码的原理是:遍历帖子中的所有链接,如果链接的域名和当前页面不一样,就给它加上 target="_blank" 属性,强制在新标签页打开。

rel="noopener noreferrer" 是什么? 这是安全相关的属性,防止新打开的页面通过 window.opener 操控你的原页面,同时避免泄露来源信息。

三、额外的增强方案:油猴脚本

如果你的需求不只是简单的"外部链接新标签页",而是想要更智能的控制,比如:

  • 在帖子列表中直接中键/后台打开多个帖子
  • 控制帖内链接的打开方式
  • 解决论坛本身的一些限制

可以试试这个油猴脚本:Discourse 新标签页 (Greasy Fork 上有)。

这个脚本是社区开发者 @selakyselaky 制作的,可以自动识别 Discourse 论坛,让帖子链接在后台新标签页打开,不用手动按住 Ctrl 或中键点链接了。

脚本的功能特点:

场景 行为
从任意页面打开主题帖 新标签页打开
在主题帖内部点击其他链接 新标签页打开
从任意页面打开用户主页 新标签页打开
打开图片等附件 保留原生跳转方式

脚本作者提到一个需要注意的地方:“在主题帖内部点击其他链接时,用新标签页打开” 这条规则可能与某些功能(如聊天窗口)冲突,如果遇到问题可以在脚本设置中关闭这条规则。

四、帖子中插入链接的注意事项

4.1 保证外部链接新窗口打开

如果你想在写帖子的时候就强制某个外部链接在新窗口打开,可以用 HTML 语法:

html

点我访问外部网站

这样写出来的链接,不管用户怎么设置,都会在新标签页打开。

4.2 识别问题:URL 不要直接贴在文字后面

Discourse 会自动把帖文中的 URL 识别为超链接,但如果你这样写:

text

https://example.com是一个网站链接

系统会把"是一个网站链接"也当成 URL 的一部分,导致超链接错误。

正确写法 :在 URL 和后面的文字之间加空格,或者用尖括号包裹 URL:

text

https://example.com 是一个网站链接。

这样系统就能准确识别 URL 的边界了。

五、总结

方法 适用人群 生效范围 难度
个人偏好设置 普通用户 仅自己 :star:
后台全局设置 管理员 全站用户 :star:
主题组件 管理员(有代码能力) 全站用户 :star::star::star:
油猴脚本 普通用户(装插件) 仅自己 :star::star:
HTML 手动写链接 发帖用户 仅当前帖子 :star:

最推荐的方案

  • 如果你是普通用户 :去个人偏好设置里勾选"在新标签页中打开所有外部链接"
  • 如果你是论坛管理员 :去后台开启 external_links_in_new_tab 全局设置

两个操作加起来不超过 1 分钟,就能解决你的问题。

最新回复

请先登录后再回复 登录

uid:3 一级用户组
关注
发帖 25
评论 25
粉丝 0
关注 0
发新帖
目录
解决Discourse超链接直接跳转问题