Изменение состояния кнопок при клике на них при помощи JS

154
26 марта 2022, 16:10
<div class="track d-flex align-items-center">
  <span class="play">
    <i class="fa fa-play" aria-hidden="true"></i>
    <img class="pause" src="/images/pause-icon.svg" alt="">
  </span>
  <a href="/inner/music" class="d-flex flex-column track_name--wrap">
    <span class="track_name">Oh My Love</span>
    <span class="track_singer">The Score</span>
  </a>
  <div class="track_top ml-auto">1</div>
    <div class="track_download">
    <a href="#">
       svg class="download-icon">
          <use xlink:href="/images/sprite.svg#download"></use>
       </svg>
    </a>
  </div>
</div>
<div class="track d-flex align-items-center">
  <span class="play">
    <i class="fa fa-play" aria-hidden="true"></i>
    <img class="pause" src="/images/pause-icon.svg" alt="">
  </span>
  <a href="/inner/music" class="d-flex flex-column track_name--wrap">
    <span class="track_name">Oh My Love</span>
    <span class="track_singer">The Score</span>
  </a>
  <div class="track_top ml-auto">1</div>
    <div class="track_download">
    <a href="#">
       svg class="download-icon">
          <use xlink:href="/images/sprite.svg#download"></use>
       </svg>
    </a>
  </div>
</div>
let play = document.querySelectorAll('.track .play');
let playerContainer = document.querySelector('.audio-player-container');
Array.prototype.forEach.call(play, function (item) {
   item.addEventListener('click', function () {
       playerContainer.classList.add('show');
       item.classList.toggle('clicked');
       if (item.classList.contains('clicked')) {
           audioPlayer.api("play");
       } else {
           audioPlayer.api("pause");
       }
   });
});

Есть массив из кнопок play. При клике на play ему добавляется класс clicked, при повторном клике класс убирается. Нужно сделать так чтобы при клике на другую кнопку плей, класс убирался у предыдущей нажатой кнопки и добавлялся текущей нажатой кнопке. Но при этом чтобы работал и toggle класса если нажать на эту кнопку еще раз.

Answer 1

На jQuery в две-три строчки кода можно сделать:

$('.icon').click(function(){ 
  $(this).toggleClass('clicked'); 
  $('.icon').not(this).removeClass('clicked'); 
})
.song { 
  display: flex; 
  align-items: center; 
  padding: 10px; 
  border-bottom: 1px solid silver; 
} 
.name { 
  font-family: sans-serif; 
  font-size: 16px; 
  padding-left: 15px; 
} 
.icon { 
  width: 55px; 
  height: 55px; 
  border-radius: 50%; 
  background-color: #6ba9ec; 
  position: relative; 
  cursor: pointer; 
} 
.icon:before { 
  content: ''; 
  display: block; 
  position: absolute; 
  border: 12px solid transparent; 
  border-left: 22px solid white; 
  top: 15px; 
  left: 20px; 
} 
.icon.clicked { 
  background-color: #90919a; 
} 
.icon.clicked:before { 
  border: 5px solid white; 
  border-top: 0; 
  border-bottom: 0; 
  height: 22px; 
  width: 7px; 
  top: 16px; 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 
<div class="song"> 
  <div class="icon"></div> 
  <div class="name"><b>Song One</b><br />Singer One</div> 
</div> 
<div class="song"> 
  <div class="icon"></div> 
  <div class="name"><b>Song Two</b><br />Singer Two</div> 
</div> 
<div class="song"> 
  <div class="icon"></div> 
  <div class="name"><b>Song Three</b><br />Singer Three</div> 
</div>

READ ALSO
React. как корректно хранить состояние?

React. как корректно хранить состояние?

Пишу виджет комментариев, нужно реализовать возможность сворачивание ветки с дочерними комментариямиНа входе имеется json, который с помощью...

115
Как работает озвучивание текста с помощью speechSynthesis?

Как работает озвучивание текста с помощью speechSynthesis?

Возникла необходимость реализовать озвучивание текста на сайтеДля этого использовался метод speechSynthesis, но на некоторые вопросы, касающиеся...

190
Реализация мини слайдера — почему в одном случае стрелка работает правильно, а в другом нет?

Реализация мини слайдера — почему в одном случае стрелка работает правильно, а в другом нет?

Всем привет В общем, я делаю свой мини слайдер, и на этом моменте я просто застрял, не понимаю в чем ошибка

121
Максимальное значение setinterval и как его обойти

Максимальное значение setinterval и как его обойти

использую setinterval и тут у меня возник один вопросКак я понял, максимальное значение - 2147483647, если указать 2147483648, то код будет выполняться сразу

136