Как не использовать теги привязки в боковой навигации и верхней панели навигации

#javascript #jquery #html

#javascript #jquery #HTML

Вопрос:

У меня есть всплывающее окно, которое будет появляться всякий раз, когда появляется внешняя ссылка. Если это не внешняя ссылка, ссылка должна открыться на новой вкладке. Проблема, с которой я сталкиваюсь, заключается в том, что этот подход нацелен на привязанные теги в панели навигации и открывает страницу на новой вкладке. Это должно происходить только для документов pdf и так далее.

Ниже приведена моя логика, которая определяет, является ли это внешней ссылкой или нет. Мне трудно игнорировать ссылки, которые находятся на моей панели навигации, а также на боковой панели навигации.

 $( document ).ready(function() {

$("a:not('.frontEndToolsModal')").on('click', function(e){
    e.preventDefault();
    var url = $(this).attr('href'),
        host = location.host;               

    if (url.indexOf(host) > -1 || url.indexOf('http','https') == -1){
        /* If we find the host name within the URL,
           OR if we do not find http or https, 
           meaning it is a relative internal link.

           The following statements is to not interefere with Mura CMS front end tools
        */

        if(url.indexOf('/admin/?muraAction=cArch.list') == 0){
            var newTab = window.open(url, '_blank');
            newTab.focus();
        }
        else if(url.indexOf('/admin/?muraAction') == 0){
            //do nothing
        }else{                          
            var newTab2 = window.open(url, '_blank');
            newTab2.focus();
        }
    }
  

Для панели навигации они имеют следующую структуру:

 <ul id="navPrimary" class="nav navbar-nav nav-nowrap">

        <li class="first" id="navAboutUs"><a href="#">About Us</a></li>
</ul>
  

а для боковой панели навигации он имеет следующий html:

 <nav id="navStandard" class="mura-nav-standard well">
        <ul class="nav nav-list">

    <li class="first"><a href="#">Medical Services Authorization Status Tracker</a></li> 
  

Мой вопрос: как не включать боковую навигацию и верхнюю панель навигации в мою функцию щелчка?

Ответ №1:

Я смог выяснить это с помощью attr() и проверки, содержит ли привязанный тег «target=’_blank'».

Итак, я сделал следующее:

 if($(this).attr("target") != '_blank'){
    window.location.href = url;
}
else{
    var newTab1 = window.open(url, '_blank');
    newTab1.focus();
}
  

Ответ №2:

Этот код:

 $("a:not('.frontEndToolsModal')").on('click', function(e){
  // stuff happens
}
  

…говорит «щелчок по любому a элементу, у которого есть класс frontEndToolsModal … случается всякое.

Это означает, что все ссылки a на вашем сайте, кроме ссылок с этим классом. Вероятно, это слишком широкий выбор для вашей функции click. Реальное решение здесь состоит в том, чтобы найти другой селектор, который работает для элементов, при нажатии на которые вы ХОТИТЕ, чтобы эта функция запускалась. Вероятно, это означает добавление какого-либо нового класса к тем элементам, которые вы хотите запустить функцию, и соответствующее обновление JS:

 $("a.someNewClass").on('click', function(e){
  // stuff happens
}
  

Комментарии:

1. Я полагаю, что это говорит о «щелчке по любому элементу, у которого нет класса frontEndToolsModal». Да, вы правы, это слишком широко, однако большинство тегов привязки не имеют классов. Чтобы реализовать ваш подход, мне нужно было бы перейти на каждую страницу. В настоящее время это работает нормально, и добавлена дополнительная логика. Спасибо за ваш комментарий

2. @INSGUEST по мере того, как проект становится большим, необходимо иметь четкие способы ориентирования на конкретные объекты. Подумайте, что вы также можете настраивать таргетинг на объекты в зависимости от их контекста, например, на какой контейнер находится a ссылка в: $(".one-container a").on('click', function() { ...do stuff }); и затем $(".another-container a").on('click', function() { ...do other stuff });

3. Да, вы снова правы. Я сообщаю об этом отделу маркетинга относительно будущего контента, который они могут добавить на сайт.