2010-05-26 68 views
50

如何测试链接是外部链接还是内部链接?请注意:测试链接是否使用jQuery/javascript进行外部链接?

  1. 我不能硬编码本地域。
  2. 我无法测试“http”。我可以通过http绝对链接轻松地链接到我自己的网站。
  3. 我想使用jQuery/javascript,而不是css。

我怀疑答案位于location.href的某处,但解决方案无视我。

谢谢!

+0

你要检查它链接被点击时,或在页面加载? – Elangovan 2010-05-26 07:42:12

+0

页面加载,谢谢。 – Matrym 2010-05-26 07:52:58

+1

你的回答不起作用。所有检查应该在'element.href'(从DOM)完成,而不是'$(element).attr('href')'。证明:http://jsfiddle.net/rahzy/1/请接受肖恩的答案。 – Nowaker 2011-10-26 14:49:15

回答

33
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'); 
}); 
+0

这工作得很好,尽管如果别人有更优雅的解决方案,我会延迟答案。出于好奇,为什么锚点链接注册为外部? – Matrym 2010-05-26 08:05:35

+7

我很确定这不会与相关网址一起使用。 'attr'应该返回属性,而不是属性(该属性可能被解析,而不是属性)。 – 2010-05-26 10:12:31

+10

http://jsfiddle.net/zuSeh/验证此方法不适用于相关网址。 – 2010-05-26 10:14:50

0

是的,我相信你可以检索当前的域名与location.href。另一种可能性是创建一个链接元素,将src设置为/,然后检索规范URL(如果您使用一个URL而不一定是域名,将检索基本URL)。

也看到这个帖子:Get the full URI from the href property of a link

35

和无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 
+1

这是验证的方式 – 2010-05-26 08:28:31

+1

这个答案更准确。亲属网址也很重要。 – Savageman 2010-05-26 22:37:46

+0

如果我没有弄错,“($ | /”实际上应该是“($ | /)”,并用右大括号 – 2012-07-25 08:08:35

6
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

+1为正则表达式,尽管它不能完全解决问题 – feeela 2012-12-08 21:58:20

6

你忘了一个,如果您使用的是相对什么地方

+0

并非所有的相对URL都以'/'开头。你可以引用像'images/logo.png'这样的文件夹,它是你当前位置的一个文件夹。在这种情况下,你在相对URL中引用了一个相对路径,它在你网站的不同目录中会有不同的含义。 '/ images/logo.png'是它运行的任何站点的绝对路径(因此是相对性的)。您的代码不会包含像'images/logo.png'这样的相对路径。 – 2014-05-08 21:54:37

48

我知道这个帖子是旧的,但它仍然显示在结果的顶部,所以我想提供另一种方法。我看到了一个锚元素的所有正则表达式检查,但为什么不使用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 
    } 
} 
+7

这是唯一对我有意义的答案 - 其他答案是过度工程化的。有没有反对这种方法的争论? – tremby 2014-10-08 01:01:44

+0

上面的jQuery在Safari中适用于我,并处理其他人处理的所有问题 - 本地锚,相对URL,跨协议URL等。注意:http://www.example.com和https:/ /www.example.com将被标记为内部;这可能对你很重要。 – 2015-06-17 00:05:51

+1

这是最好的答案。这使用了'a。主机“属性,这对于普通JavaScript开发人员来说可能是未知的(包括我在阅读本文之前)。 – dana 2015-11-10 17:47:53

7

这里有一个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; 
}) 

http://jsfiddle.net/mblase75/7z6EV/

+0

+1:OK有办法赞成票再次为这个答案:) – 2014-06-06 15:43:01

+0

第一个不为“//代码工作.jquery.com/jquery.min.js“是一个完全合法的URL,但不是内部的。协议和冒号不是必需的,因为浏览器将使用当前网站正在使用的任何内容(半分类协议相对URL)。 – mikesir87 2014-10-21 19:04:47

+1

@ mikesir87好点,更新。 – Blazemonger 2014-10-21 19:15:28

0

对于那些有兴趣,我做了一个带有检查的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的开始和结尾是否有斜线。虽然刚开始时检查'/'可能就足够了。

1

您可以使用is-url-external模块。

var isExternal = require('is-url-external'); 
isExternal('http://stackoverflow.com/questions/2910946'); // true | false 
0

我用这个函数的jQuery:

$.fn.isExternal = function() { 
    var host = window.location.host; 
    var link = $('<a>', { 
    href: this.attr('href') 
    })[0].hostname; 
    return (link !== host); 
}; 

用法为:$('a').isExternal();

例子:https://codepen.io/allurewebsolutions/pen/ygJPgV