如何自动添加target=“_空白“;仅限于外部链接
How to automatically add target="_blank" to external links only?
我正在构建一个自定义的、特定于行业的cms(使用django)。在后台,网站管理员可以指定一个内部链接,例如"/page1"或一个外部链接,用于整个网站的各种导航元素(渲染时都使用<a>
)。问题是,我希望在当前选项卡中打开内部链接,但外部链接应该使用target="_blank"
来打开新的选项卡或窗口。
我如何处理html来实现这一点?
我更喜欢服务器端解决方案,但我不知道有任何干净的方法来预处理django中的渲染模板。因此,我认为最直接的方法可能是javascript/jquery解决方案:一个在加载每个页面时运行的脚本,它将target="_blank"属性添加到所有外部链接,而不是内部链接。但我也不知道该怎么做。
我已经使用以下内容一段时间了。记不清我最初在哪里找到的:
$.expr[':'].external = function(obj){
return !obj.href.match(/^mailto':/)
&& (obj.hostname != location.hostname)
&& !obj.href.match(/^javascript':/)
&& !obj.href.match(/^$/)
};
这添加了一个:external
jQuery选择器,因此您可以执行以下操作:
$('a:external').attr('target', '_blank');
使用自定义选择器的好处在于,如果你需要修改"外部"链接的组成部分,你可以在一个地方更改它,而不用担心代码的其余部分。例如,在我的组织中,我们有一些子域不是"外部"的,但我们仍然希望在新窗口中打开。
尝试类似的东西
for (var links = document.links, i = 0, a; a = links[i]; i++) {
if (a.host !== location.host) {
a.target = '_blank';
}
}
不要忘记在文档树中存在所有链接时运行脚本-在window.onload
事件中。
您可以这样做:
$(document.body).on('mouseover', 'a[target!=_blank]:not(.local)', function (evt) {
var a = $(this);
var href = a.attr('href');
var domain = href.match(/^https?:'/'/([^:'/]+)/);
if (domain && domain[1] && domain[1] !== "yourdomain.com") {
a.attr('target', '_blank');
} else {
a.addClass('local');
}
});
这将在您单击每个链接时对其进行处理,并且不应多次处理每个链接。如果它需要是外部的,target
将被设置为_blank
,并且它应该在一个新窗口中打开。这是一把正在工作的小提琴。
更新:我确定链接是否留在现场的方法相当粗糙。这个答案中的方法比较彻底。我可能会用那个测试来代替我的简单regex匹配。
我建议您在服务器端这样做。根据链接的位置修改页面的模板。
另一个JavaScript解决方案:
(() => {
(document.querySelectorAll('a')).forEach(link => {
link.hostname !== location.hostname && link.setAttribute('target', '_blank');
})
})();
由于@Chris Pratt的公认答案不适用于例如tel:links和其他特殊情况,为了不接触特殊链接,我只使用了以下变体:
(function($) {
$.expr[':'].external = function(obj){
return (obj.hostname != location.hostname) && obj.href.startsWith("http");
};
$('a:external').attr('target', '_blank');
}) (jQuery);
您也可以这样做:
$("a[href^='http://']").attr("target","_blank");
或
$('a').each(function() {
var a = new RegExp('/' + window.location.host + '/');
if(!a.test(this.href)) {
$(this).click(function(event) {
event.preventDefault();
event.stopPropagation();
window.open(this.href, '_blank');
});
}
});
代码中的微小更改,不会产生错误,额外的=在!==
$.expr[':'].external = function(obj){
return !obj.href.match(/^mailto':/) && (obj.hostname !== location.hostname) && !obj.href.match(/^javascript':/) && !obj.href.match(/^$/);
};
$('a:external').attr('target', '_blank');
- Cordova RSS馈送的链接不会在外部浏览器中打开
- 外部链接的Javascript文件赢得't执行,但函数有效
- Facebook共享链接适用于用户,但不适用于粉丝页面管理员
- 动态虚拟目录和外部 JavaScript 链接
- Web 地址虚拟目录会断开外部 JavaScript 链接,因此找不到文件
- Cordova包装应用程序内部链接加载在应用程序中,外部链接加载在浏览器中
- 正在创建网页,并希望将外部链接调用为html和css
- 为在新窗口中打开外部链接创建异常
- 将外部JavaScript与Jekyll链接时出现问题
- 将外部链接编写到js文件中
- 打开除域之外在新选项卡中打开的所有外部链接
- javascript打开外部程序中的链接,而不是浏览器
- 具有http外部链接的SSL网站
- 什么'这是使用jQuery将一些文本锚定到外部链接的最简单方法
- 如何自动添加target=“_空白“;仅限于外部链接
- javascript外部链接文件的可接受数量是多少
- 平滑滚动仅适用于同一页面,而不适用于外部链接
- 无法使用jQuery按钮链接连接外部HTML文件
- 使内部链接成为外部链接
- 提取所有超链接(从外部网站)使用node.js和请求