2014-09-04 71 views
0

我在银行网站上使用以下代码来警告用户他们将离开网站。在JavaScript弹出警告消息中排除特定网址

$('a').filter(function() { 
      return this.hostname && this.hostname !== location.hostname; 
      }) 
      .click(function() { 
      return window.confirm('Warning message here...'); 
      }); 
}); 

当前当您点击在线银行登录时,您将看到弹出窗口。我需要能够排除不属于网站域名的特定网址,因此我可以排除网上银行网站,但我不知道如何去做。

任何帮助表示赞赏。

回答

1
$('body').on('click', 'a', function(e){ 
    if(this.hostname != 'mydomain.com' && this.hostname != 'www.mydomain.com'){ 
    if(!confirm('This is an external link. Are you sure you want to leave?')){ 
     e.preventDefault(); 
    } 
    } 
}); 

我在这里使用event delegation以确保它捕获所有链接(包括注入的链接)。 如果您有子域(例如www.mydomain.com),则可能需要添加多个域条件。

+0

所以我会把其中mydomain.com是上面显示的网站的域名?你可以给我一个例子,我将如何添加另一个域到该JavaScript?谢谢。 – Lonnie 2014-09-04 21:39:22

+0

@Lonnie这是正确的,只需将其替换为您的域。我更新了代码以显示多个域。 – Ryan 2014-09-04 21:41:35

+0

我用这个替换了原来的脚本并添加了两个域,它不起作用。弹出窗口根本不显示任何外部链接。 – Lonnie 2014-09-04 21:58:51

0

下面是Ryan回答的改进,它允许您阻止自己的域以及外部链接的特定路径。

它会单独检查主机和路径 - 因此您可以阻止所有不属于您自己的域的链接,以及您自己的域中的特定路径。

如果用户点击被阻止的链接,“request_confirmation”功能会在允许导航离开当前页面之前向用户请求确认。

我已将逻辑分解为多个功能,因此您可以轻松修改它。

$('body').on('click', 'a', function(e){ 
    return (should_link_be_blocked($(this).attr('href')))? request_confirmation() : true; 
}); 

function should_link_be_blocked(link){ 
    var url = new URL(link); 

    return should_host_be_blocked(url.hostname) || should_path_be_blocked(url.pathname); 
} 

    function should_host_be_blocked(host){ 
    return !(host.match(/([a-z0-9]+\.)?example.com/)); 
    } 

    function should_path_be_blocked(path){ 
    var not_allowed = ['/block_me.html', '/block_another.html']; 
    var block = false; 

    not_allowed.forEach(function(n_a){ 
     block = (path == n_a)? true : block; 
    }); 

    return block; 
    } 

function request_confirmation(){ 
    return confirm('This is an external link. Are you sure you want to leave?'); 
} 

这里工作的是一个丑陋的例子:http://codepen.io/anon/pen/Gjagi

+0

不幸的是,这个例子只适用于我在铬,在safari弹出窗口不起作用。我必须让它在safari的mac上也能正常工作。 – Lonnie 2014-09-05 15:25:23