#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. Да, вы снова правы. Я сообщаю об этом отделу маркетинга относительно будущего контента, который они могут добавить на сайт.