В BS v4 есть метод .tab('show')
, но закрывать вкладки нечего, поэтому вы правы, что вам придется вручную обновлять классы и атрибуты, чтобы отключить панель.
Ваш текущий прослушиватель событий будет срабатывать только тогда, когда событие вызвано щелчком на активном элементе навигации. Это может помочь закрыть текущий элемент навигации, но никак не отреагирует на щелчки в документе в целом.
Вам понадобится еще один слушатель на уровне документа. Затем проверьте, нажали ли вы где-то, что не было частью навигации, и выполните тот же код, чтобы закрыть активную вкладку
// listen for clicks to active nav
$(document).on('click', '.nav-link.active', function() {
hideTab($(this))
});
// listen for clicks everywhere
$(document).on('click', function(e) {
// if clicked on nav, return
if ($(e.target).closest(".nav-tabs,.tab-content").length) {return}
// otherwise, off clicks should close nav
hideTab($('.nav-link.active'))
});
function hideTab($activeNav) {
// deselect nav item
$activeNav.removeClass('active').attr('aria-selected', "false")
// identify tab pane & deselect
$($activeNav.attr("href")).removeClass('active');
}
Демонстрация в фрагментах стека
// listen for clicks to active nav
$(document).on('click', '.nav-link.active', function() {
hideTab($(this))
});
// listen for clicks everywhere
$(document).on('click', function(e) {
// if clicked on nav, return
if ($(e.target).closest(".nav-tabs,.tab-content").length) {return}
// otherwise, off clicks should close nav
hideTab($('.nav-link.active'))
});
function hideTab($activeNav) {
// deselect nav item
$activeNav.removeClass('active').attr('aria-selected', "false")
// identify tab pane & deselect
$($activeNav.attr("href")).removeClass('active');
}
body {
background-color: #fff1d7 !important;
padding: 15px;
height: 100vh;
}
.tab-content,
.nav-tabs {
background: white;
}
.tab-pane {
padding: 10px;
}
h2 {
margin-top: 3em !important;
}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/css/bootstrap.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/js/bootstrap.bundle.js"></script>
<!-- Nav tabs -->
<ul class="nav nav-tabs" role="tablist">
<li class="nav-item">
<a class="nav-link" data-toggle="tab" href="#home" role="tab">Home</a>
</li>
<li class="nav-item">
<a class="nav-link" data-toggle="tab" href="#profile" role="tab">Profile</a>
</li>
</ul>
<!-- Tab panes -->
<div class="tab-content">
<div class="tab-pane" id="home" role="tabpanel">Home Info</div>
<div class="tab-pane" id="profile" role="tabpanel">Profile Info</div>
</div>
<h2>Click Anywhere to Close </h2>