RegEx表达式或jQuery选择器不匹配href中的“外部”链接

时间:2014-06-06 14:45:18

标签: javascript jquery html regex

我有一个覆盖链接行为的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网站,因此不太可能发生绝对网站网址。

2 个答案:

答案 0 :(得分:4)

我可能会使用选择器:

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

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

请注意,mailto:是正确的,而不是原始问题中的mailto://


为了彻底,以下内容还将捕获使用绝对URL(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/

答案 1 :(得分: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
    }

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/