排除javascript弹出警告消息上的特定URL

时间:2014-09-04 21:07:29

标签: javascript jquery popup external-links

我在银行网站上使用以下代码警告用户他们要离开网站。

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

目前,当您点击网上银行登录时,您会看到弹出窗口。我需要能够排除不属于网站域名的特定网址,以便我可以排除网上银行网站,但我不知道该怎么做。

感谢任何帮助。

2 个答案:

答案 0 :(得分: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),则可能需要添加多个域条件。

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