Исключить определенные URL-адреса в всплывающем предупреждающем сообщении JavaScript

Я использую следующий код на банковском веб-сайте, чтобы предупредить пользователей о том, что они покидают веб-сайт.

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

В настоящее время, когда вы нажимаете на логин онлайн-банкинга, вы получаете всплывающее окно. Мне нужно иметь возможность исключать определенные URL-адреса, которые не являются частью доменного имени веб-сайта, поэтому я могу исключить веб-сайт онлайн-банкинга, но я не знаю, как это сделать.

Любая помощь приветствуется.

2 ответа

Решение
$('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();
    }
  }
});

Я использовал делегирование событий здесь, чтобы убедиться, что оно захватывает все ссылки (включая вставленные ссылки). Вы можете добавить условия для нескольких доменов, например, если у вас есть субдомены (www.mydomain.com).

Вот уточнение ответа Райана, которое позволяет вам блокировать определенные пути в вашем собственном домене, а также внешние ссылки.

Он проверяет хост и путь отдельно - так что вы можете заблокировать все ссылки, которые не из вашего собственного домена, а также конкретные пути в вашем собственном домене.

Если пользователь нажимает на заблокированную ссылку, функция 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

Другие вопросы по тегам