在安企CMS的日常内容运营中,我们经常会利用urlize过滤器来便捷地将文章内容中的网址和邮箱地址自动转换为可点击的链接。这无疑为内容排版和用户体验提供了极大的便利。然而,细心的用户可能会发现,urlize过滤器在生成这些链接时,默认并不会让它们在新窗口或新标签页中打开,这可能与我们希望外部链接不影响当前页面浏览的习惯有所出入。
面对urlize过滤器本身并未提供直接设置target="_blank"的参数,我们该如何实现所有经其处理的外部链接都能在新窗口中打开呢?答案是,我们可以通过一段简洁而高效的JavaScript代码,在页面加载完成后,对这些自动生成的链接进行统一处理。
动态为外部链接添加新窗口打开属性
实现这一功能的核心思路是,在网站页面内容完全加载之后,利用JavaScript遍历页面上所有的链接(<a>标签)。接着,程序会判断每个链接是否指向当前网站之外的域名。一旦识别出外部链接,就会为其添加target="_blank"属性,使其在新窗口中打开。同时,为了增强安全性,我们还会一并添加rel="noopener noreferrer"属性。
下面是实现这一功能的JavaScript代码片段:
document.addEventListener('DOMContentLoaded', function() {
// 获取当前网站的域名,用于判断链接是否为外部链接
const currentHostname = window.location.hostname;
// 遍历页面上所有的链接(<a>标签)
document.querySelectorAll('a').forEach(link => {
// 检查链接的href属性是否存在,并且链接的域名与当前网站域名不一致
// 同时排除锚点链接或内部JS功能链接,这些链接通常没有hostname或与当前hostname相同
if (link.href && link.hostname && link.hostname !== currentHostname) {
link.setAttribute('target', '_blank'); // 设置在新窗口打开
link.setAttribute('rel', 'noopener noreferrer'); // 增强安全性
}
});
});
将代码应用到您的安企CMS网站
要让这段JavaScript代码在您的安企CMS网站上生效,并且覆盖所有页面,最推荐的做法是将其添加到网站的通用模板文件base.html中。这样,无论用户访问哪个页面,这段脚本都会被执行。
以下是具体的实施步骤:
进入安企CMS后台并打开模板文件: 首先,登录您的安企CMS后台。在左侧导航菜单中找到“模板设计”,然后点击“网站模板管理”。在这里,您可以看到您当前使用的模板包。通常,主模板文件名为
base.html(或layout.html、default.html等,具体文件名请根据您的模板实际情况确定,它通常包含了网站的<html>,<head>,<body>等基础结构)。点击编辑该文件。粘贴JavaScript代码: 将上面提供的JavaScript代码复制。然后,在
base.html文件的<head>标签内,或者更推荐地,在</body>标签结束之前(这样可以确保页面内容先加载,提升用户体验),粘贴这段代码。 例如,您可以将其放置在</body>闭合标签之前:<script> document.addEventListener('DOMContentLoaded', function() { const currentHostname = window.location.hostname; document.querySelectorAll('a').forEach(link => { if (link.href && link.hostname && link.hostname !== currentHostname) { link.setAttribute('target', '_blank'); link.setAttribute('rel', 'noopener noreferrer'); } }); }); </script> </body> </html>保存并清理缓存: 保存对
base.html文件的修改。为了确保更改立即生效,请务必返回安企CMS后台,点击“更新缓存”功能,清理网站的页面缓存。
完成以上步骤后,所有通过urlize过滤器自动转换,以及其他手动添加但未设置target="_blank"的外部链接,都将在用户点击时,于新的浏览器窗口或标签页中打开。
温馨提示
- 代码放置位置: 如果您将JavaScript放置在
<head>标签内,建议使用defer属性或确保代码在DOMContentLoaded事件监听器中执行,以避免在DOM未完全加载时操作元素。放置在</body>闭合标签前是更常见的推荐做法。 - 兼容性: 这段代码使用了现代JavaScript语法,在大多数现代浏览器中都能良好运行。如果您的网站需要支持非常旧的浏览器,可能需要考虑使用Babel进行转译或使用更传统的JS选择器和事件绑定方式。
- 效果检查: 修改完成后,请务必在网站前端多处点击外部链接,验证功能是否按预期工作。
通过这种JavaScript动态处理的方式,我们既能享受urlize过滤器带来的便捷,又能满足外部链接在新窗口打开的用户体验和安全需求,让您的安企CMS网站在内容呈现上更加完善。
常见问题 (FAQ)
Q1: 为什么urlize过滤器本身不提供target='_blank'的选项?
A1: urlize过滤器主要关注于识别文本中的URL并将其转化为有效的超链接,同时自动添加rel="nofollow"属性以优化SEO和避免链接权重流失。target="_blank"是一个关于用户界面和用户体验的决策,不同的网站可能有不同的偏好。为了保持过滤器的核心职责单一性,并避免在默认行为中强制引入可能不符合所有用户需求的UI/UX行为,设计者通常会将这类功能留给开发者通过JavaScript或模板层面的定制来实现,或者在CMS后台提供统一的全局设置(如果CMS有此功能)。
Q2: 代码中rel='noopener noreferrer'是做什么用的?有必要添加吗?
A2: rel="noopener noreferrer"这两个属性是强烈推荐添加到所有target="_blank"的外部链接上的安全增强措施:
noopener: 阻止新打开的页面访问原始页面的window.opener对象。这意味着新页面无法恶意控制原始页面(例如,将原始页面重定向到钓鱼网站)。noreferrer: 不向新打开的页面发送Referer(来源)头信息。这可以保护用户的隐私,避免将用户从您的网站跳转到其他网站的来源信息泄露出去。 添加它们非常有必要,可以有效防止一些钓鱼攻击和隐私泄露问题,提高您网站的安全性。
Q3: 如果我只想让特定区域(比如文章正文)的外部链接在新窗口打开,而不是全站,该如何操作?
A3: 如果您只想针对页面中的特定区域(例如,只有文章内容部分)进行此操作,可以将JavaScript代码中的选择器document.querySelectorAll('a')替换为更具体的选择器。
例如,如果您的文章正文内容都被包裹在一个具有id="article-content"的<div>标签内,您可以将选择器改为document.querySelectorAll('#article-content a')。这样,JavaScript就只会查找和修改这个特定区域内的链接。
同样的原理也适用于其他任何具有特定ID或CSS类的容器。