“默认在新标签页中打开外部链接”不起作用

你好,

最近,我论坛上的所有外部链接都无法在新标签页中打开。我已双重检查了“默认在新标签页中打开外部链接”选项,确认已勾选:

我通过检查元素查看了链接背后的 HTML 代码,发现 target="_blank" 明显缺失。

我该怎么办?

您试过在安全模式下运行吗?也许是一个新主题、主题组件或插件造成了干扰?:face_with_monocle:

我尝试在安全模式下运行该网站,但问题依旧。

您运行的是哪个版本的 Discourse?这样我更容易确认是否能复现问题。

我正在运行最新的 2.7.0.beta1 版本。

你可以在 Meta 上测试一下。在这里设置你的偏好,让外部链接在新标签页中打开,看看是否对你有效。对我来说效果相当不错。

你好 @riteshsaini

排查问题的最佳第一步之一,是直接使用网页开发控制台检查 DOM 结构,并查看你链接的具体属性,尤其是“target”属性。

通常,你无法通过直接阅读源代码看到这些 DOM 属性(这些属性可能存在于 DOM 中,但不存在于源代码中),因此你需要查询 DOM 以获取这些属性(以确保 100% 准确)。

希望这能帮到你。

我相信他在这里就是这样做的

不。阅读源代码并不等同于检查 DOM。

DOM 属性可能与源代码不同(而且通常确实不同),尤其是在那些大量使用 JavaScript 操作 DOM 的网站(如 Discourse)上。

这就是我特意提到要查询 DOM,而不仅仅是查看源代码的原因 :slight_smile:

不过,我同意你的看法,@osioke,源代码确实清楚地显示缺少 target 属性;但当我们检查 DOM 时,我们就能“确定”该属性的实际状态,因为 DOM 的状态可能与源代码不同(而且通常确实不同)。

就我个人而言,我非常推崇“绝不假设任何事”的原则,因此我建议 @riteshsaini 通过检查 DOM 来“确认”,然后再“据此进行下一步”。

DOM 和源代码中的链接 target 属性很可能处于相同的状态;但我始终建议大家在排查问题时不要假设这类细节,因此我提出将查询 DOM 作为一个故障排查步骤。

希望这能帮到你。

与其在设置中调整,我更倾向于使用这种方法:

演示:https://theme-creator.discourse.org/theme/Bcat/auto_link_new_tab

<script type="text/discourse-plugin" version="0.8">
    api.onPageChange((url, title) => {
        // 自动在新标签页或窗口中打开外部链接
        var pc = 1;
        if ($("html").hasClass("mobile-device")) pc = 0;
        var links = document.links;
        for (var i = 0, linksLength = links.length; i < linksLength; i++) {
            if (links[i].hostname != window.location.hostname) {
                if (pc) links[i].target = '_blank'; else links[i].target = '_self';
            }
        }
    });
</script>

……并完美地通过一个扎实的 Discourse API 示例进行了说明,展示了 DOM 和源代码将处于不同的状态,因此您将无法在由上述 JavaScript 设置的 HTML 源代码中看到目标属性 :slight_smile:

@Bcat 感谢分享这段代码。但我应该把它加在哪里呢?

附:抱歉问这个愚蠢的问题。我不是程序员,对 Discourse 也完全是新手 :slight_smile:

@neounix,谢谢你的回复。

我不太确定该怎么做 :slight_smile: 如果你有空的话,请给我指点一下。

查看主题:Installing a theme or theme component

discourse-automatically-open-external-links-in-new-tab.zip|附件 (843 字节)

你是否检查过个人配置文件中的 preferences/interface 设置?通常出现这种情况是因为在个人配置文件中禁用了在新标签页中打开外部链接的选项。

之前该选项未勾选,所以我把它勾选上了。现在只有在我登录时,链接才会在新标签页中打开。如果我在无痕模式下检查该网站,它仍然无法正常工作。

它运行得完美无缺!非常感谢 :slight_smile:

有没有什么方法可以给所有外部链接添加 rel="nofollow",包括管理员添加的那些?

我已经为此挣扎了好几个月了。

对于用于分享和下载(通过 bitly 链接或安全性较低的网站)的论坛,您是否考虑使用 rel="noopener noreferrer" 来替代 rel="nofollow"
您可以了解更多关于 noopener noreferrer 的信息。

我可以考虑添加 noopener noreferrer,但我仍然需要同时添加 nofollow。问题是,我不希望 Google 抓取或索引这些链接,因为它们是联盟链接。只有 nofollow 能解决这个问题。

添加 links[i].rel = 'nofollow'; 或下载文件:discourse-automatically-open-external-links-in-new-tab.zip|附件 (856 字节)