如何测试链接是否为外部链接或内部链接?请注意:
- 我不能硬编码本地域名。
- 我不能测试"http"。我可能会使用http绝对链接链接到自己的网站。
- 我想使用jQuery / javascript,而不是css。
我怀疑答案在location.href中,但解决方案让我无从下手。
谢谢!
如何测试链接是否为外部链接或内部链接?请注意:
我怀疑答案在location.href中,但解决方案让我无从下手。
谢谢!
我知道这篇文章很旧了,但它仍然出现在搜索结果的顶部,所以我想提供另一种方法。我看到有关锚元素的所有正则表达式检查,但为什么不只是使用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
}
}
a.host
属性,这个属性可能对于普通的JavaScript开发人员来说是未知的(包括我在内,在读到这篇文章之前)。 - danavar 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检查,可以改进它。
这个问题仍然有很多访问量,并且有很多人告诉我这个被接受的解决方案会在几种情况下失败。正如我所说的,这是一个非常快速而简单的答案,以展示解决此问题的主要方法。更复杂的解决方案是使用在<a>
(锚点)元素上可访问的属性。就像@Daved已经在这个答案中指出的那样,关键是将hostname
与当前window.location.hostname
进行比较。我更喜欢比较hostname
属性,因为如果端口不同于80,则host
属性将包括端口。
$( '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' );
});
attr
应该返回属性而不是属性值(属性值可能会被解析,但并不属于属性)。 - Sean Kinsey还有一种无需使用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"));
}
所有以http
(http://、https://)开头之外的href都会自动视为本地链接。
location.protocol+'//'+location.host
开头。
请查看此fiddle:http://jsfiddle.net/framp/Ag3BT/1/ - framphref="//somedomain.com/some-path"
),这种方法将无法正常工作。 - rossipediavar external = RegExp('^((f|ht)tps?:)?//(?!' + location.host + ')');
使用方法:
external.test('some url'); // => true or false
$('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;
})
Uncaught Error: Syntax error, unrecognized expression: a[href^="(http:|https:)?//"])
。 - kthornbloom 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文件(本地或外部),可以使用“本地下载”或“外部下载”类。但是目前还没有找到解决方案。
images/logo.png
的内容,该内容比当前位置低一个文件夹。在这种情况下,您正在引用相对URL中的相对路径,在站点的不同目录中具有不同的含义。/images/logo.png
是运行在任何网站上的绝对路径(因此是相对的)。您的代码将不包括像images/logo.png
这样的相对路径。 - Adam Plocherconst isExternalLink = (url) => {
const tmp = document.createElement('a');
tmp.href = url;
return tmp.host !== window.location.host;
};
// output: true
console.log(isExternalLink('https://foobar.com'));
console.log(isExternalLink('//foobar.com'));
// output: false
console.log(isExternalLink('https://www.stackoverflow.com'));
console.log(isExternalLink('//www.stackoverflow.com'));
console.log(isExternalLink('/foobar'));
console.log(isExternalLink('#foobar'));
hostname
;const lnk = document.createElement('a');
lnk.href = '/foobar';
console.log(lnk.host); // output: 'www.stackoverflow.com'
const lnk = document.createElement('a');
lnk.href = '#foobar';
console.log(lnk.host); // output: 'www.stackoverflow.com'
const lnk = document.createElement('a');
lnk.href = '//www.stackoverflow.com';
console.log(lnk.host); // output: 'www.stackoverflow.com'
jQuery('a').each(function() {
if (this.host !== window.location.host) {
console.log(jQuery(this).attr('href'));
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
var isExternal = require('is-url-external');
isExternal('https://dev59.com/BnE85IYBdhLWcg3wKwSE'); // true | false
这应该适用于除IE浏览器外的任何浏览器上的任何链接。
// check if link points outside of app - not working in IE
try {
const href = $linkElement.attr('href'),
link = new URL(href, window.location);
if (window.location.host === link.host) {
// same app
} else {
// points outside
}
} catch (e) { // in case IE happens}
new URL(href, window.location)
:类型为'Location'的参数不能赋值给类型为'string | URL | undefined'的参数。 - Cezary Tomczyk