Я пытаюсь показать содержимое выпадающего списка в активном меню, я пробовал несколько функций в jquery и js, но не смог заставить его работать.
Функция Jquery, показывающая обычное содержимое вкладок, но не содержимое вкладок в раскрывающемся списке.
Функция Javascript отключает все вкладки и не показывает содержимое ни для одной из них.
Вот мои коды:
$(document).ready(function () {
// Show the dropdown when the "View All" link is clicked
$(".dropdown").click(function (e) {
e.stopPropagation(); // Prevent the event from propagating to the parent element
$(".dropdown-tab").toggleClass("active");
});
// Hide the dropdown when the user clicks outside of it
$(document).click(function (e) {
if (!$(e.target).closest(".dropdown-tab").length) {
$(".dropdown-tab").removeClass("active");
}
});
// Switch between tabs
$(".tabs li.tab-link").click(function () {
var tab_id = $(this).attr("data-tab");
$(".tabs li").removeClass("current");
$(".tab-content").removeClass("current");
$(this).addClass("current");
$("#" + tab_id).addClass("current");
});
// Show tab content when drop-link is clicked
$(".dropdown-tab .drop-link").click(function () {
var tab_id = $(this).attr("data-tab");
$(".tabs li").removeClass("current");
$(".tab-content").removeClass("current");
$(".dropdown-tab").removeClass("active");
$("#" + tab_id).addClass("current");
$(".tabs li[data-tab='" + tab_id + "']").addClass("current");
});
});
.cat-tab {
position: relative;
width: 100%;
height: auto;
margin-bottom: 30px;
}
.tabs {
position: relative;
margin: 0px;
padding: 0px;
list-style: none;
border-bottom: 2px solid #e44e4e;
z-index: 1;
}
.tabs li {
color: #222;
display: inline-block;
padding: 10px 15px;
cursor: pointer;
}
.tabs li.current {
background-color: #e44e4e;
color: #fff;
}
.tabs li.tab-link:last-child {
float: right;
}
.tab-content {
display: none;
background: #fff;
padding: 15px;
}
.tab-content.current {
display: inherit;
}
.tabs .dropdown-tab {
display: none;
}
.tabs .dropdown-tab.active {
display: block;
}
.tabs .dropdown {
position: relative;
}
.dropdown-tab {
position: absolute;
width: 270px;
top: 100%;
right: 0;
background-color: #fff;
border: 1px solid #ccc;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
padding: 10px;
z-index: 90999;
}
.drop-link {
display: block;
color: #222;
padding: 10px 15px;
cursor: pointer;
}
.drop-link:hover {
background-color: #f2f2f2;
}
@media screen and (max-width: 500px) {
ul.tabs > li.dropdown {
display: block;
}
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class = "cat-tab">
<ul class = "tabs">
<li class = "tab-link current" data-tab = "tab-1">Tab One</li>
<li class = "tab-link" data-tab = "tab-2">Tab Two</li>
<li class = "tab-link" data-tab = "tab-3">Tab Three</li>
<li class = "tab-link" data-tab = "tab-4">Tab Four</li>
<li class = "tab-link"><a href = "#" class = "dropdown">View All</a>
<ul class = "dropdown-tab">
<li class = "drop-link current" data-tab = "tab-5">Tab 5</li>
<li class = "drop-link" data-tab = "tab-6">Tab 6</li>
<li class = "drop-link" data-tab = "tab-7">Tab 7</li>
<li class = "drop-link" data-tab = "tab-8">Tab 8</li>
<li class = "drop-link" data-tab = "tab-9">Tab 9</li>
</ul>
</li>
</ul>
<div id = "tab-1" class = "tab-content current">sometext 1</div>
<div id = "tab-2" class = "tab-content">sometext 2</div>
<div id = "tab-3" class = "tab-content">sometext 3</div>
<div id = "tab-4" class = "tab-content">sometext 4</div>
<div id = "tab-5" class = "tab-content">sometext 5</div>
<div id = "tab-6" class = "tab-content">sometext 6</div>
<div id = "tab-7" class = "tab-content">sometext 7</div>
<div id = "tab-8" class = "tab-content">sometext 8</div>
<div id = "tab-9" class = "tab-content">sometext 9</div>
</div>
Я пробовал javascript, вот так:
function toggleDropdown() {
var dropdown = document.querySelector('.dropdown-tab');
if (dropdown.style.display === 'block') {
dropdown.style.display = 'none';
} else {
dropdown.style.display = 'block';
var currentTab = document.querySelector('.tab-link.current');
if (currentTab) {
var currentTabId = currentTab.getAttribute('data-tab');
var currentContent = document.getElementById(currentTabId);
currentTab.classList.remove('current');
currentContent.classList.remove('current');
}
}
var tabContents = document.querySelectorAll('.tab-content');
tabContents.forEach(function(content) {
if (content.classList.contains('current')) {
content.classList.remove('current');
}
});
var dropdownTabs = document.querySelectorAll('.drop-link');
dropdownTabs.forEach(function(tab) {
tab.addEventListener('click', function() {
var tabId = this.getAttribute('data-tab');
var tabContent = document.getElementById(tabId);
dropdownTabs.forEach(function(tab) {
tab.classList.remove('current');
});
tabContents.forEach(function(content) {
content.classList.remove('current');
});
tab.classList.add('current');
tabContent.classList.add('current');
dropdown.style.display = 'none';
});
});
}
И определенная функция в HTML:
<li class = "tab-link"><a href = "#" class = "dropdown">View All</a>
Проблема :
Когда вы нажимаете на drop-link li, это также вызывает другой обработчик событий, например: $(".tabs li.tab-link")..., что приводит к скрытию вкладок.
Решение :
Один из способов решить эту проблему — исключить dropdown li из вашего обработчика событий, то есть: $(".tabs li:not(.dropdown_menu)").. . Кроме того, вы можете удалить часть повторяющегося кода, потому что оба обработчика событий выполняют одинаковую работу.
Демонстрационный код:
$(document).ready(function() {
// Show the dropdown when the "View All" link is clicked
$(".dropdown").click(function(e) {
e.stopPropagation(); // Prevent the event from propagating to the parent element
$(".dropdown-tab").toggleClass("active");
});
// Hide the dropdown when the user clicks outside of it
$(document).click(function(e) {
if (!$(e.target).closest(".dropdown-tab").length) {
$(".dropdown-tab").removeClass("active");
}
});
//excluding other selector...
$(".tabs li:not(.dropdown_menu)").click(function() {
show_hide_tabs(this)
});
$(".tabs li.drop-link").click(function() {
show_hide_tabs(this)
});
function show_hide_tabs(el) {
var tab_id = $(el).attr("data-tab");
$(".tabs li,.tab-content").removeClass("current");
$(".dropdown-tab").removeClass("active");
$("#" + tab_id).addClass("current");
$(".tabs li[data-tab='" + tab_id + "']").addClass("current");
}
});
.cat-tab {
position: relative;
width: 100%;
height: auto;
margin-bottom: 30px;
}
.tabs {
position: relative;
margin: 0px;
padding: 0px;
list-style: none;
border-bottom: 2px solid #e44e4e;
z-index: 1;
}
.tabs li {
color: #222;
display: inline-block;
padding: 10px 15px;
cursor: pointer;
}
.tabs li.current {
background-color: #e44e4e;
color: #fff;
}
.tabs li.tab-link:last-child {
float: right;
}
.tab-content {
display: none;
background: #fff;
padding: 15px;
}
.tab-content.current {
display: block;
}
.tabs .dropdown-tab {
display: none;
}
.tabs .dropdown-tab.active {
display: block;
}
.tabs .dropdown {
position: relative;
}
.dropdown-tab {
position: absolute;
width: 270px;
top: 100%;
right: 0;
background-color: #fff;
border: 1px solid #ccc;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
padding: 10px;
z-index: 90999;
}
.drop-link {
display: block;
color: #222;
padding: 10px 15px;
cursor: pointer;
}
.drop-link:hover {
background-color: #f2f2f2;
}
@media screen and (max-width: 500px) {
ul.tabs>li.dropdown {
display: block;
}
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class = "cat-tab">
<ul class = "tabs">
<li class = "tab-link current" data-tab = "tab-1">Tab One</li>
<li class = "tab-link" data-tab = "tab-2">Tab Two</li>
<li class = "tab-link" data-tab = "tab-3">Tab Three</li>
<li class = "tab-link" data-tab = "tab-4">Tab Four</li>
<!--added here one extra class-->
<li class = "tab-link dropdown_menu"><a href = "#" class = "dropdown">View All</a>
<ul class = "dropdown-tab">
<li class = "drop-link" data-tab = "tab-5">Tab 5</li>
<li class = "drop-link" data-tab = "tab-6">Tab 6</li>
<li class = "drop-link" data-tab = "tab-7">Tab 7</li>
<li class = "drop-link" data-tab = "tab-8">Tab 8</li>
<li class = "drop-link" data-tab = "tab-9">Tab 9</li>
</ul>
</li>
</ul>
<div id = "tab-1" class = "tab-content current">sometext 1</div>
<div id = "tab-2" class = "tab-content">sometext 2</div>
<div id = "tab-3" class = "tab-content">sometext 3</div>
<div id = "tab-4" class = "tab-content">sometext 4</div>
<div id = "tab-5" class = "tab-content">sometext 5</div>
<div id = "tab-6" class = "tab-content">sometext 6</div>
<div id = "tab-7" class = "tab-content">sometext 7</div>
<div id = "tab-8" class = "tab-content">sometext 8</div>
<div id = "tab-9" class = "tab-content">sometext 9</div>
</div>
Вопрос для информации! задам еще вопрос. Можно ли использовать каждую функцию для нескольких вкладок?
Да, вы можете, но что именно вам нужно сделать, зациклившись?
У меня есть несколько вкладок на одной странице, и я хочу использовать один и тот же код для всех вкладок, а не повторять код для каждой вкладки.
Да, вы можете. Дайте мне знать, как только вы добавите еще один вопрос, мы это проверим.
Не могли бы вы помочь с этим вопросом, пожалуйста? stackoverflow.com/q/75461119/19168006
Не могли бы вы создать образец в песочнице кода, так будет легче найти проблему и сотрудничать.