在href中使用正则表达式或jQuery选择器以不匹配“外部”链接

3

我有一个jQuery插件,可以重写链接的行为,以允许页面内容的Ajax加载。使用委托事件很简单,例如$(document).on('click','a', function(){})

但是我只想将其应用于不像这些链接的链接(Ajax加载对它们不适用,所以这样的链接需要正常工作):

target="_blank"      // New browser window
target="_self"       // Force replacement of current window (specific to my plugins)
href="#..."          // Bookmark link (page is already loaded). 
href="afs://..."     // AFS file access. 
href="cid://..."     // Content identifiers for MIME body part.
href="file://..."    // Specifies the address of a file from the locally accessible drive.
href="ftp://..."     // Uses Internet File Transfer Protocol (FTP) to retrieve a file.
href="http://..."    // The most commonly used access method. 
href="https://..."   // Provide some level of security of transmission 
href="mailto://..."  // Opens an email program.
href="mid://..."     // The message identifier for email.
href="news://..."    // Usenet newsgroup.
href="x-exec://..."  // Executable program.
href="http://AnythingNotHere.com"  // External links

样例代码:

$(document).on('click', 'a:not([target="_blank"])', function(){
    var $this = $(this);
    if ('some additional check of href'){
        // Do ajax load and stop default behaviour
        return false;
    }
    // allow link to work normally
});

问:

有没有一种简单的方法可以检测出所有“本地链接”,即只在当前网站内导航的链接呢?不包括上述所有变体。

注意:这是一个MVC 5 Razor网站,因此绝对网站URL不太可能发生。


4
为什么要踩?我认为这个问题写得很好,没有任何错误。 - VisioN
1
请不要给出负面评价... 有什么有用的建议吗?这是一个完全有效的问题。 - iCollect.it Ltd
@Quentin:我已经看到那个问题了,这不是重复的(不完全相同的问题)。请仔细阅读具体细节。 - iCollect.it Ltd
这个讨论可能与此相关:http://meta.stackoverflow.com/q/251758/1249581。 - VisioN
1
它有何不同?能够识别链接并将其标记为外部链接,与能够识别它们以将其从选择中排除是相同的。 - Kevin B
显示剩余12条评论
2个回答

4

我可能会使用选择器:

$('a:not([href*="://"],[target="_blank"],[href^="#"],[href^="mailto:"])')

http://jsfiddle.net/mblase75/Pavg2/

mailto:,而不是您原来问题中写的mailto://


http://the-domain-you-are-on-now.com/whatever.html) 的内部链接:

$('a:not([href*="://"],[target="_blank"],[href^="#"],[href^="mailto:"]),a[href^="'+location.protocol+'//'+location.hostname+'"]')

http://jsfiddle.net/mblase75/Pavg2/4/


建议您也将此内容发布到 https://dev59.com/BnE85IYBdhLWcg3wKwSE。 - iCollect.it Ltd
1
你承认这是一个重复的问题吗? - Blazemonger
不,只是答案也涵盖了那个问题。你会注意到他们的问题中没有mailto或其他自定义链接 :) - iCollect.it Ltd
+1赞一个漂亮的jsFiddle,但是它是否可以处理使用绝对路径的内部链接呢?还是我错了?! - A. Wolff
@A.Wolff 您的意思是使用相同域名的内部链接?这是一个合理的限制,但OP并没有要求。我会看看我能想出什么。 - Blazemonger
显示剩余7条评论

3
我不知道为什么你会否决我的上一个答案,但在参考网址上,你会找到确切的条件。
var a = new RegExp('/' + window.location.host + '/');
     if(!a.test(this.href)){
     //do stuff when it an external link
     }
    else{
    // do stuff when it's internal link
    }

这里是参考资料http://css-tricks.com/snippets/jquery/open-external-links-in-new-window/,介绍了如何使用jQuery在新窗口中打开外部链接。

实际上我是stackoverflow的新手 - Hitesh Chandwani
2
@TrueBlueAussie 注意他正在使用href属性,而不是href属性。两者是有区别的。这个区别使得这个答案是正确的,而疑似重复的答案是不正确的。 - Kevin B
1
我已经在Chrome中确认过了,但我还没有进行跨浏览器检查。如果有一些旧版本的IE不能以同样的方式工作,我也不会感到惊讶。http://jsfiddle.net/W5u8e/ - Kevin B
不一定,那只是两个更简单的检查。测试目标属性和哈希属性。 - Kevin B
@Kevin B:如果他这样做了,我肯定会点赞,因为它回答了所提出的问题。目前它只回答了另一个“重复”的问题 :) - iCollect.it Ltd
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接