如何测试链接是外部链接还是内部链接?请注意:测试链接是否使用jQuery/javascript进行外部链接?
- 我不能硬编码本地域。
- 我无法测试“http”。我可以通过http绝对链接轻松地链接到我自己的网站。
- 我想使用jQuery/javascript,而不是css。
我怀疑答案位于location.href的某处,但解决方案无视我。
谢谢!
如何测试链接是外部链接还是内部链接?请注意:测试链接是否使用jQuery/javascript进行外部链接?
我怀疑答案位于location.href的某处,但解决方案无视我。
谢谢!
var comp = new RegExp(location.host);
$('a').each(function(){
if(comp.test($(this).attr('href'))){
// a link that contains the current host
$(this).addClass('local');
}
else{
// a link that does not contain the current host
$(this).addClass('external');
}
});
注意:这仅仅是一个快速&肮脏的例子。它将匹配所有href =“#anchor”链接 作为外部。这可能会通过进行一些额外的RegExp检查而得到改进。
更新2016年11月17日
这个问题仍然有大量的流量,我被一吨的人告诉我,这接受的解决方案会多次失败。正如我所说,这是一个非常快速和肮脏的答案,以显示如何解决这个问题的主要方式。更复杂的解决方案是使用可在<a>
(锚点)元素上访问的属性。就像@Daved在这个答案中已经指出的那样,关键是要比较hostname
与当前的window.location.hostname
。我宁愿比较hostname
性质,因为他们从来没有包括其中包含的host
财产,如果从80
不同的port
所以在这里,我们去:艺术的
$('a').each(function() {
if(location.hostname === this.hostname || !this.hostname.length) {
$(this).addClass('local');
} else {
$(this).addClass('external');
}
});
州:
Array.from(document.querySelectorAll('a')).forEach(a => {
a.classList.add(location.hostname === a.hostname || !a.hostname.length ? 'local' : 'external');
});
这工作得很好,尽管如果别人有更优雅的解决方案,我会延迟答案。出于好奇,为什么锚点链接注册为外部? – Matrym 2010-05-26 08:05:35
我很确定这不会与相关网址一起使用。 'attr'应该返回属性,而不是属性(该属性可能被解析,而不是属性)。 – 2010-05-26 10:12:31
http://jsfiddle.net/zuSeh/验证此方法不适用于相关网址。 – 2010-05-26 10:14:50
是的,我相信你可以检索当前的域名与location.href。另一种可能性是创建一个链接元素,将src设置为/,然后检索规范URL(如果您使用一个URL而不一定是域名,将检索基本URL)。
和无jQuery的方式
var nodes = document.getElementsByTagName("a"), i = nodes.length;
var regExp = new RegExp("//" + location.host + "($|/)");
while(i--){
var href = nodes[i].href;
var isLocal = (href.substring(0,4) === "http") ? regExp.test(href) : true;
alert(href + " is " + (isLocal ? "local" : "not local"));
}
周
所有的HREF不开始http
(HTTP://,https://开头):
external.test('some url'); // => true or false
这是验证的方式 – 2010-05-26 08:28:31
这个答案更准确。亲属网址也很重要。 – Savageman 2010-05-26 22:37:46
如果我没有弄错,“($ | /”实际上应该是“($ | /)”,并用右大括号 – 2012-07-25 08:08:35
var external = RegExp('^((f|ht)tps?:)?//(?!' + location.host + ')');
使用自动处理路径。
forexample:/测试
hostname = new RegExp(location.host);
// Act on each link
$('a').each(function(){
// Store current link's url
var url = $(this).attr("href");
// Test if current host (domain) is in it
if(hostname.test(url)){
// If it's local...
$(this).addClass('local');
}
else if(url.slice(0, 1) == "/"){
$(this).addClass('local');
}
else if(url.slice(0, 1) == "#"){
// It's an anchor link
$(this).addClass('anchor');
}
else {
// a link that does not contain the current host
$(this).addClass('external');
}
});
也有文件的下载名为.zip的问题(本地连接外置),其可以使用类“本地下载”或“外部下载”。但还没有找到解决方案。
+1为正则表达式,尽管它不能完全解决问题 – feeela 2012-12-08 21:58:20
你忘了一个,如果您使用的是相对什么地方
并非所有的相对URL都以'/'开头。你可以引用像'images/logo.png'这样的文件夹,它是你当前位置的一个文件夹。在这种情况下,你在相对URL中引用了一个相对路径,它在你网站的不同目录中会有不同的含义。 '/ images/logo.png'是它运行的任何站点的绝对路径(因此是相对性的)。您的代码不会包含像'images/logo.png'这样的相对路径。 – 2014-05-08 21:54:37
我知道这个帖子是旧的,但它仍然显示在结果的顶部,所以我想提供另一种方法。我看到了一个锚元素的所有正则表达式检查,但为什么不使用window.location.host
并检查元素的host
属性?
function link_is_external(link_element) {
return (link_element.host !== window.location.host);
}
使用jQuery:
$('a').each(function() {
if (link_is_external(this)) {
// External
}
});
,并与普通的JavaScript:
var links = document.getElementsByTagName('a');
for (var i = 0; i < links.length; i++) {
if (link_is_external(links[i])) {
// External
}
}
这是唯一对我有意义的答案 - 其他答案是过度工程化的。有没有反对这种方法的争论? – tremby 2014-10-08 01:01:44
上面的jQuery在Safari中适用于我,并处理其他人处理的所有问题 - 本地锚,相对URL,跨协议URL等。注意:http://www.example.com和https:/ /www.example.com将被标记为内部;这可能对你很重要。 – 2015-06-17 00:05:51
这是最好的答案。这使用了'a。主机“属性,这对于普通JavaScript开发人员来说可能是未知的(包括我在阅读本文之前)。 – dana 2015-11-10 17:47:53
这里有一个jQuery选择只有外部链接:
$('a[href^="(http:|https:)?//"])')
jQuery选择仅适用于内部链接(不包括泸定在同一页内的散列链接)需要一个比较复杂:
$('a:not([href^="(http:|https:)?//"],[href^="#"],[href^="mailto:"])')
附加过滤器可以被放置在:not()
条件内,并根据需要通过额外的逗号分隔。
http://jsfiddle.net/mblase75/Pavg2/
或者,我们可以筛选使用香草的JavaScript href
属性,它始终是一个绝对URL的内部链接:
$('a').filter(function(i,el) {
return el.href.indexOf(location.protocol+'//'+location.hostname)===0;
})
+1:OK有办法赞成票再次为这个答案:) – 2014-06-06 15:43:01
第一个不为“//代码工作.jquery.com/jquery.min.js“是一个完全合法的URL,但不是内部的。协议和冒号不是必需的,因为浏览器将使用当前网站正在使用的任何内容(半分类协议相对URL)。 – mikesir87 2014-10-21 19:04:47
@ mikesir87好点,更新。 – Blazemonger 2014-10-21 19:15:28
对于那些有兴趣,我做了一个带有检查的if块的三元版本,以查看该元素具有哪些类别以及哪些类别s被附上。
$(document).ready(function() {
$("a").click(function (e) {
var hostname = new RegExp(location.host);
var url = $(this).attr("href");
hostname.test(url) ?
$(this).addClass('local') :
url.slice(0, 1) == "/" && url.slice(-1) == "/" ?
$(this).addClass('localpage') :
url.slice(0, 1) == "#" ?
$(this).addClass('anchor') :
$(this).addClass('external');
var classes = $(this).attr("class");
console.log("Link classes: " + classes);
$(this).hasClass("external") ? googleAnalytics(url) :
$(this).hasClass("anchor") ? console.log("Handle anchor") : console.log("Handle local");
});
});
的谷歌分析位被忽略,但是这是你可能会喜欢做一些与URL现在你知道它是什么类型的链接。只需在三元块内添加代码即可。 如果您只想检查1种链接,则用if语句替换三元组。
编辑添加我遇到的问题。我的一些hrefs是“/ Courses /”。我做了一个本地页面的检查,检查href的开始和结尾是否有斜线。虽然刚开始时检查'/'可能就足够了。
您可以使用is-url-external模块。
var isExternal = require('is-url-external');
isExternal('http://stackoverflow.com/questions/2910946'); // true | false
我用这个函数的jQuery:
$.fn.isExternal = function() {
var host = window.location.host;
var link = $('<a>', {
href: this.attr('href')
})[0].hostname;
return (link !== host);
};
用法为:$('a').isExternal();
你要检查它链接被点击时,或在页面加载? – Elangovan 2010-05-26 07:42:12
页面加载,谢谢。 – Matrym 2010-05-26 07:52:58
你的回答不起作用。所有检查应该在'element.href'(从DOM)完成,而不是'$(element).attr('href')'。证明:http://jsfiddle.net/rahzy/1/请接受肖恩的答案。 – Nowaker 2011-10-26 14:49:15