Почему не работают табы?

219
23 октября 2021, 16:20

Почему не работают мульти вложенные табы, когда родители обернуты в <div>? Конечно же не дает sublings, но как сделать по другому?

$('.link').on('click', function() { 
  $(this).siblings('.link').removeClass('active'); 
  $(this).addClass('active'); 
 
  $(this).siblings('.tab').hide(); 
 
  var index = $(this).parent().children('.link').index( $(this) );   
   
  console.clear(); console.log(index); 
 
  $(this).siblings('.tab').eq( index ).show(); 
});
	.tab { 
  display: none; 
} 
.tab-content { 
  display: none; 
} 
.tab-content>.tab>.tab-content { 
  
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
<div class="mama-tab"> 
        <!-- Первый уровень РОДИТЕЛИ--> 
        <div> 
        	<button class="link">iPhone 5</button> 
        	<button class="link">iPhone 5S</button> 
        	<button class="link">iPhone 5C</button> 
                <button class="link">iPhone 6C</button> 
                <button class="link">iPhone 7C</button> 
        </div> 
        <!-- Первый уровень ДЕТИ-->	 
        	<div class="tab"> 
        		<button class="link">Попал в воду</button> 
        		<button class="link">Не работает тачскрин</button> 
        		<button class="link">Не работает дисплей</button> 
        		 
        		<div class="tab">Попал в воду - 3000 руб </div> 
        		<div class="tab"></div> 
        		<div class="tab"></div> 
        	</div> 
        <!-- Первый уровень ДЕТИ-->		 
        	<div class="tab"> 
        		<button class="link">Попал в воду</button> 
        		<button class="link">Не работает тачскрин</button> 
        		<button class="link">Не работает дисплей</button> 
        		 
        		<div class="tab">Попал в воду - 4000 руб </div> 
        		<div class="tab"></div> 
        		<div class="tab"></div> 
        	</div> 
        <!-- Первый уровень ДЕТИ-->		 
        	<div class="tab"> 
        		<button class="link">Попал в воду</button> 
        		<button class="link">Не работает тачскрин</button> 
        		<button class="link">Не работает дисплей</button> 
        		 
        		<div class="tab">Попал в воду - 5000 руб </div> 
        		<div class="tab"></div> 
        		<div class="tab"></div> 
        	</div> 
        	 
        <!-- Первый уровень ДЕТИ-->		 
        	<div class="tab"> 
        		<button class="link">Попал в воду</button> 
        		<button class="link">Не работает тачскрин</button> 
        		<button class="link">Не работает дисплей</button> 
        		 
        		<div class="tab">Попал в воду - 6000 руб </div> 
        		<div class="tab"></div> 
        		<div class="tab"></div> 
        	</div> 
        	 
        	<!-- Первый уровень ДЕТИ-->	 
        	<div class="tab"> 
        		<button class="link">Попал в воду</button> 
        		<button class="link">Не работает тачскрин</button> 
        		<button class="link">Не работает дисплей</button> 
        		 
        		<div class="tab">Попал в воду - 7000 руб </div> 
        		<div class="tab"></div> 
        		<div class="tab"></div> 
        	</div> 
        </div>

Answer 1

Добавил класс для главных ссылок ( 1 уровня ). Что бы для них правильно находились соседи и чуть чуть стилей

$('.link').on('click', function() { 
  $(this).siblings('.link').removeClass('active'); 
  $(this).addClass('active'); 
 
  const index = $(this).parent().children('.link').index( $(this) ); 
   
  let linksBlock = $(this).closest('.main-links'); 
  if (linksBlock.length === 0) { 
    linksBlock = $(this); 
  } 
 
  linksBlock.siblings('.tab').hide(); 
  linksBlock.siblings('.tab').eq(index).show(); 
});
.tab { 
  display: none; 
} 
 
.tab-content { 
  display: none; 
} 
 
.link { 
  background: #fff; 
  border: 1px solid #ddd; 
  border-radius: 5px; 
  margin: 5px; 
  padding: 3px 8px; 
  cursor: pointer; 
} 
 
.link:focus { 
  outline: none; 
} 
 
.link.active { 
  border: 1px solid #000; 
} 
 
.content { 
  margin: 5px; 
  padding: 10px; 
  border: 1px solid #ddd; 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
<div class="mama-tab"> 
  <!-- Первый уровень РОДИТЕЛИ--> 
  <div class='main-links'> 
    <button class="link">iPhone 5</button> 
    <button class="link">iPhone 5S</button> 
    <button class="link">iPhone 5C</button> 
    <button class="link">iPhone 6C</button> 
    <button class="link">iPhone 7C</button> 
  </div> 
  <!-- Первый уровень ДЕТИ-->	 
    <div class="tab"> 
      <button class="link">Попал в воду</button> 
      <button class="link">Не работает тачскрин</button> 
      <button class="link">Не работает дисплей</button> 
 
      <div class="tab content">Попал в воду - 3000 руб </div> 
      <div class="tab content">Не работает тачскрин - 5000 руб</div> 
      <div class="tab content">Не работает дисплей - 10000 руб</div> 
    </div> 
  <!-- Первый уровень ДЕТИ-->		 
    <div class="tab"> 
      <button class="link">Попал в воду</button> 
      <button class="link">Не работает тачскрин</button> 
      <button class="link">Не работает дисплей</button> 
 
      <div class="tab content">Попал в воду - 4000 руб </div> 
      <div class="tab content">Не работает тачскрин - 5000 руб</div> 
      <div class="tab content">Не работает дисплей - 10000 руб</div> 
    </div> 
  <!-- Первый уровень ДЕТИ-->		 
    <div class="tab"> 
      <button class="link">Попал в воду</button> 
      <button class="link">Не работает тачскрин</button> 
      <button class="link">Не работает дисплей</button> 
 
      <div class="tab content">Попал в воду - 5000 руб </div> 
      <div class="tab content">Не работает тачскрин - 5000 руб</div> 
      <div class="tab content">Не работает дисплей - 10000 руб</div> 
    </div> 
 
  <!-- Первый уровень ДЕТИ-->		 
    <div class="tab"> 
      <button class="link">Попал в воду</button> 
      <button class="link">Не работает тачскрин</button> 
      <button class="link">Не работает дисплей</button> 
 
      <div class="tab content">Попал в воду - 6000 руб </div> 
      <div class="tab content">Не работает тачскрин - 5000 руб</div> 
      <div class="tab content">Не работает дисплей - 10000 руб</div> 
    </div> 
 
    <!-- Первый уровень ДЕТИ-->	 
    <div class="tab"> 
      <button class="link">Попал в воду</button> 
      <button class="link">Не работает тачскрин</button> 
      <button class="link">Не работает дисплей</button> 
 
      <div class="tab content">Попал в воду - 7000 руб </div> 
      <div class="tab content">Не работает тачскрин - 5000 руб</div> 
      <div class="tab content">Не работает дисплей - 10000 руб</div> 
    </div> 
</div>

Сейчас правда между табами сохраняется стейт дочерних табов. Нужно вам это или нет, решайте сами. В любом случае, для решения именно этой проблемы, лучше подумать об архитектуре ( выносе активного таба в стейт и так далее )

READ ALSO
Не срабатывает вызов функции JQUERY

Не срабатывает вызов функции JQUERY

есть код, после завершения таймера должна срабатывать requestAnimationFrame(animate) - отрисовка canvas, но она не срабатывает

98
Необходимо кешировать данные с помощью memcached

Необходимо кешировать данные с помощью memcached

Пробовал гетеры сетеры, но ничего не выводится, даже прологировать не вышло(попали ли данные в кеш или нет или подключился memcached или нет) https://wwwnpmjs

284
Среднее арифметическое узлов графа

Среднее арифметическое узлов графа

Есть ф-я которая суммирует значения узлов графа

198
Построить линию по полученным данным

Построить линию по полученным данным

из базы получаю данные json = {[x,y],[x,y]}

94