多个选项卡列表:如何仅显示所单击选项卡列表的内容?

时间:2017-03-08 14:36:52

标签: javascript jquery html tabs onclick

我有几个使用事件on('click')的标签。问题是每当我单击触发事件的选项卡时,它也会影响其他选项卡。如何防止它被触发或影响其他标签。

以下是我正在构建的标签示例 -

$(document).ready(function() {
    $('.tabs-list li:first').addClass('active'),
    $('.tab-content .show-content:first').addClass('active');
   
   $('.tabs-list li').click(function(e) {
       event.preventDefault();
       if(!$(this).hasClass('active')) {
           var tabIndex = $(this).index();
           var nthChild = tabIndex + 1;
           
           $('.tabs-list li.active').removeClass('active');
           $(this).addClass('active');
           $('.tab-content .show-content').removeClass('active');
           $('.tab-content .show-content:nth-child('+ nthChild +')').addClass('active');
       }
   })
})
.tabs-list li {
  display: inline-block;
}


.tab-content .show-content {
    display: none
}

.tab-content .show-content.active {
    display: block;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="tabs-list">
   <li>Tab 1</li>
   <li>Tab 2</li>
</ul>

<div class="tab-content">
    <div class="show-content">
    Content 1
    </div>
    
    <div class="show-content">
    Content 2
    </div>
    
</div>


<ul class="tabs-list">
   <li>Tab 1</li>
   <li>Tab 2</li>
</ul>

<div class="tab-content">
    <div class="show-content">
    Content 1
    </div>
    
    <div class="show-content">
    Content 2
    </div>
    
</div>

3 个答案:

答案 0 :(得分:0)

您可以尝试访问事件的目标节点及其信息,以确保您应该执行。

function modalBackgroundClick(e) {
    if (e.target.id == "modalContainer") {
        modalContainer.style.display = "none";
    }
}

这是检查您是否实际点击了模态背景,但它应该是类似的功能

答案 1 :(得分:0)

您的网页中有多个.tabs-list.tab-content,因此当您使用选择器$('.tabs-list ...')$('.tab-content ...')时,您不仅可以选择点击的.tabs-list及其相应的.tab-content,但所有.tabs-list.tab-content

您需要坚持$(this)(代表点击的.tabs-list)并从$(this)中选择所有其他元素。 jQuery提供了几个帮助来实现它,比如.parent().find().next()

以下是使用这些帮助程序的代码的固定版本:

$(document).ready(function() {
    $('.tabs-list li:first').addClass('active'),
    $('.tab-content .show-content:first').addClass('active');
   
   $('.tabs-list li').click(function(e) {
       event.preventDefault();
       if(!$(this).hasClass('active')) {
           var tabIndex = $(this).index();
           var nthChild = tabIndex + 1;

           // select the right elements
           var $tabsList = $(this).parent();
           var $tabContent = $tabsList.next('.tab-content');
           
           $tabsList.find('li.active').removeClass('active');
           $(this).addClass('active');
           $tabContent.find('.show-content').removeClass('active');
           $tabContent.find('.show-content:nth-child('+ nthChild +')').addClass('active');
       }
   })
})
.tabs-list li {
  display: inline-block;
}


.tab-content .show-content {
    display: none
}

.tab-content .show-content.active {
    display: block;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="tabs-list">
   <li>Tab 1</li>
   <li>Tab 2</li>
</ul>

<div class="tab-content">
    <div class="show-content">
    Content 1
    </div>
    
    <div class="show-content">
    Content 2
    </div>
    
</div>


<ul class="tabs-list">
   <li>Tab 1</li>
   <li>Tab 2</li>
</ul>

<div class="tab-content">
    <div class="show-content">
    Content 1
    </div>
    
    <div class="show-content">
    Content 2
    </div>
    
</div>

答案 2 :(得分:0)

您需要链接标签列表和标签内容。 为tabs-list添加了一个data-target属性,指向要与标签链接的标签内容(或者只使用next()作为GG建议如下) 请参见调整后的JS

$(document).ready(function() {
    $('.tabs-list li:first').addClass('active'),
    $('.tab-content .show-content:first').addClass('active');
   
   $('.tabs-list li').click(function(e) {
       event.preventDefault();
       
       var tabParent =($(e.currentTarget.parentElement)); 
       var targetId = tabParent.data('target');       
       var tabContent = $(targetId);
       
       if(!$(this).hasClass('active')) {
           var tabIndex = $(this).index();
           var nthChild = tabIndex + 1;
           
           tabParent.find('li.active').removeClass('active');
           $(this).addClass('active');
           tabContent.find('.show-content').removeClass('active');
           tabContent.find('.show-content:nth-child('+ nthChild +')').addClass('active');
       }
   })
})
.tabs-list li {
  display: inline-block;
}


.tab-content .show-content {
    display: none
}

.tab-content .show-content.active {
    display: block;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="tabs-list"  data-target="#contentContainer1">
   <li>Tab 1</li>
   <li>Tab 2</li>
</ul>
<div class="tab-content" id="contentContainer1">
    <div class="show-content">
    Content 1
    </div>
    
    <div class="show-content">
    Content 2
    </div>
</div>


<ul class="tabs-list" data-target="#contentContainer2">
   <li>Tab 1</li>
   <li>Tab 2</li>
</ul>
<div class="tab-content" id="contentContainer2">
    <div class="show-content">
    Content 1
    </div>
    
    <div class="show-content">
    Content 2
    </div>
</div>