简体   繁体   中英

Click function applying to all elements with same class

I have 2 sets of tabs on my page that share the same classes. I need my click function to only apply to the tab-menu thats clicked, but instead it applies to both. I know the answer lies in using "this" but I can't figure out how to plug it in

HTML:

<div className="tabbed-menu" id="tabs">
<ul className="tab-list">
<li data-tab-item="1" className="tab-item"><a href="javascript:void(0)">Active Section</a></li>
<li data-tab-item="2" className="tab-item"><a href="javascript:void(0)">Item Two</a></li>
<li data-tab-item="3" className="tab-item"><a href="javascript:void(0)">Item Three</a></li>
 </ul>
<div className="tab-container">
<div data-tab-item="1" id="tab1" className="tab-content"><p>Content Goes Here</p></div>
<div data-tab-item="2" id="tab2" className="tab-content"><p>Second Content Goes Here</p></div>
<div data-tab-item="3" id="tab3" className="tab-content"><p>Third Content Goes Here</p></div>
</div>
</div>

<div className="tabbed-menu" id="tabs2">
<ul className="tab-list">
<li data-tab-item="1" className="tab-item"><a href="javascript:void(0)">Active Section</a></li>
<li data-tab-item="2" className="tab-item"><a href="javascript:void(0)">Item Two</a></li>
<li data-tab-item="3" className="tab-item"><a href="javascript:void(0)">Item Three</a></li>
 </ul>
<div className="tab-container">
<div data-tab-item="1" id="tab1" className="tab-content"><p>Content Goes Here</p></div>
<div data-tab-item="2" id="tab2" className="tab-content"><p>Second Content Goes Here</p></div>
<div data-tab-item="3" id="tab3" className="tab-content"><p>Third Content Goes Here</p></div>
</div>
</div>

JS:

 $(document).ready(function() {
    if (!$('[data-tab-item]').hasClass('active').length){
        $('li[data-tab-item]').first().addClass('active');
        $('div[data-tab-item]').first().addClass('active');
    }   
    $(".tab-item").click(function(){
        var tabNumber = $(this).attr('data-tab-item');
        $('[data-tab-item]').removeClass('active');
        $('[data-tab-item='+ tabNumber +']').addClass('active');
    });
});

The callback function you pass to the click method can also receive a parameter in witch the event data is passed. The event data has a property called target. witch is the node on witch the event has been emitted. For your case you should not do this: $(this) but instead something like:

$(".tab-item").click(function(event){
  var tabNumber = $(event.target).attr('data-tab-item');
  $('[data-tab-item]').removeClass('active');
  $('[data-tab-item='+ tabNumber +']').addClass('active');
});

closest() will search for the closest parent. From there on you can find any element within that element.

 $(document).ready(function() { if (!$('[data-tab-item]').hasClass('active').length) { $('li[data-tab-item]').first().addClass('active'); $('div[data-tab-item]').first().addClass('active'); } $(".tab-item").click(function() { $this = $(this); $menu = $this.closest('.tabbed-menu'); $menu.find('[data-tab-item]').removeClass('active'); var tabNumber = $this.attr('data-tab-item'); $menu.find('[data-tab-item=' + tabNumber + ']').addClass('active'); }); }); 
 .tab-content { display: none; } .tab-content.active { display: block; } .active { color: red; } 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> I have 2 sets of tabs on my page that share the same classes. I need my click function to only apply to the tab-menu thats clicked, but instead it applies to both. I know the answer lies in using "this" but I can't figure out how to plug it in HTML: <div class="tabbed-menu" id="tabs"> <ul class="tab-list"> <li data-tab-item="1" class="tab-item"><a href="javascript:void(0)">Active Section</a></li> <li data-tab-item="2" class="tab-item"><a href="javascript:void(0)">Item Two</a></li> <li data-tab-item="3" class="tab-item"><a href="javascript:void(0)">Item Three</a></li> </ul> <div class="tab-container"> <div data-tab-item="1" id="tab1" class="tab-content"> <p>Content Goes Here</p> </div> <div data-tab-item="2" id="tab2" class="tab-content"> <p>Second Content Goes Here</p> </div> <div data-tab-item="3" id="tab3" class="tab-content"> <p>Third Content Goes Here</p> </div> </div> </div> <div class="tabbed-menu" id="tabs2"> <ul class="tab-list"> <li data-tab-item="1" class="tab-item"><a href="javascript:void(0)">Active Section</a></li> <li data-tab-item="2" class="tab-item"><a href="javascript:void(0)">Item Two</a></li> <li data-tab-item="3" class="tab-item"><a href="javascript:void(0)">Item Three</a></li> </ul> <div class="tab-container"> <div data-tab-item="1" id="tab1" class="tab-content"> <p>Content Goes Here</p> </div> <div data-tab-item="2" id="tab2" class="tab-content"> <p>Second Content Goes Here</p> </div> <div data-tab-item="3" id="tab3" class="tab-content"> <p>Third Content Goes Here</p> </div> </div> </div> 

Use the > selector which selects the child of the selected element. parent>child

 $(document).ready(function() { if (!$('#tabs>.tabb1>[data-tab-item]').hasClass('active').length){ alert("s"); $('#tabs>.tabb1>li[data-tab-item]').first().addClass('active'); $('#tabs>.tabb1>div[data-tab-item]').first().addClass('active'); } $("#tabs2>.tabb2>.tab-item").click(function(){ var tabNumber = $(this).attr('data-tab-item'); $('#tabs2>.tabb2>[data-tab-item]').removeClass('active'); $('#tabs2>.tabb2>[data-tab-item='+ tabNumber +']').addClass('active'); }); }); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div className="tabbed-menu" id="tabs"> <ul className="tab-list"> <li data-tab-item="1" className="tab-item"><a href="javascript:void(0)">Active Section</a></li> <li data-tab-item="2" className="tab-item"><a href="javascript:void(0)">Item Two</a></li> <li data-tab-item="3" className="tab-item"><a href="javascript:void(0)">Item Three</a></li> </ul> <div className="tab-container"> <div data-tab-item="1" id="tab1" className="tab-content"><p>Content Goes Here</p></div> <div data-tab-item="2" id="tab2" className="tab-content"><p>Second Content Goes Here</p></div> <div data-tab-item="3" id="tab3" className="tab-content"><p>Third Content Goes Here</p></div> </div> </div> <div className="tabbed-menu" id="tabs2"> <ul className="tab-list"> <li data-tab-item="1" className="tab-item"><a href="javascript:void(0)">Active Section</a></li> <li data-tab-item="2" className="tab-item"><a href="javascript:void(0)">Item Two</a></li> <li data-tab-item="3" className="tab-item"><a href="javascript:void(0)">Item Three</a></li> </ul> <div className="tab-container"> <div data-tab-item="1" id="tab1" className="tab-content"><p>Content Goes Here</p></div> <div data-tab-item="2" id="tab2" className="tab-content"><p>Second Content Goes Here</p></div> <div data-tab-item="3" id="tab3" className="tab-content"><p>Third Content Goes Here</p></div> </div> </div> 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM