@seven_8959
Пытаюсь выучить js

Как сделать чтобы отрабатывало событие зажатой ЛКМ и движения мыши?

Добрые день. Нужна помощь. Не пойму, что не так с кодом, Приложение пианино. Нужно, что бы при зажатой кнопкой ЛКМ, играли разные ноты, но что то у меня не так, по одиночке работает, но с зажатой нет только первая кнопка и когда дальше двигаешь, то ничего не происходит.
Я думаю проблема в этом участке кода, скорее всего в аргументе, но не понимаю, как это исправить.
function playAudio (data) { //start function playAudio
  const audio = document.querySelector(`audio[data-note="${data}"]`);
  audio.currentTime = 0;
  audio.play();
}


Код целиком
const piano = document.querySelector(".piano");
const collectionPiano = document.querySelectorAll(".piano-key");


function setActiveKey(event) { //active status keys mouse event
  event.target.classList.add("piano-key-active", "piano-key-active-pseudo");
}

function removeActiveKey(event) { //remove active status keys mouse event 
  event.target.classList.remove("piano-key-active", "piano-key-active-pseudo");
}

function playAudio (data) { //start function playAudio
  const audio = document.querySelector(`audio[data-note="${data}"]`);
  audio.currentTime = 0;
  audio.play();
}

function startKeyActive (event) { //mouseover and mouseout events for active status keys, pseudo and play audio
  if (event.target.classList.contains("piano-key")) {
    event.target.classList.add("piano-key-active", "piano-key-active-pseudo");
    const song = event.target.dataset.note;
    playAudio(song);
  }
  collectionPiano.forEach((el) => {
    el.addEventListener("mouseover", playAudio);
    el.addEventListener("mouseover", setActiveKey);
    el.addEventListener("mouseout", removeActiveKey);
  });
};

function stopKeyIActive () { //remove mouseover and mouseout events for active status keys, pseudo and play audio
  collectionPiano.forEach((el) => {
    el.classList.remove("piano-key-active", "piano-key-active-pseudo");
    el.removeEventListener("mouseover", playAudio);
    el.removeEventListener("mouseover", setActiveKey);
    el.removeEventListener("mouseout", removeActiveKey);
  });
};

piano.addEventListener("mousedown", startKeyActive, playAudio);
document.addEventListener("mouseup", stopKeyIActive);


window.addEventListener("keydown", (event) => { // Event keyboard - play audio
  if (event.repeat) {
    return;
  } 
  const audioKeys = document.querySelector(`audio[data-key="${event.keyCode}"]`);
  const pianoKey = document.querySelector(`.piano-key[data-key="${event.keyCode}"]`);
  audioKeys.currentTime = 0;
  audioKeys.play(); 
  pianoKey.classList.add('piano-key-active');

  window.addEventListener("keyup", () => {
    pianoKey.classList.remove('piano-key-active');
  })
});


И html

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link href="assets/piano.ico" rel="shortcut icon">
  <link href="https://fonts.gstatic.com" rel="preconnect">
  <link
    href="https://fonts.googleapis.com/css2?family=Open+Sans+Condensed:wght@300&family=Open+Sans:wght@300;400;800&display=swap"
    rel="stylesheet">
  <link href="style.css" rel="stylesheet">
  <title>virtual-piano</title>
</head>

<body>
  <header class="header">
    <h1 class="header-title">Virtual Piano</h1>
  </header>
  <main class="main">

    <div class="btn-container">
      <button class="btn btn-notes btn-active">Notes</button>
      <button class="btn btn-letters">Letters</button>
    </div>
    <div class="piano">
      <div class="piano-key" data-key="68" data-letter="D" data-note="c"></div>
      <div class="piano-key" data-key="70" data-letter="F" data-note="d"></div>
      <div class="piano-key" data-key="71" data-letter="G" data-note="e"></div>
      <div class="piano-key" data-key="72" data-letter="H" data-note="f"></div>
      <div class="piano-key" data-key="74" data-letter="J" data-note="g"></div>
      <div class="piano-key" data-key="75" data-letter="K" data-note="a"></div>
      <div class="piano-key" data-key="76" data-letter="L" data-note="b"></div>
      <div class="keys-sharp">
        <div class="piano-key sharp" data-key="82" data-letter="R" data-note="c♯"></div>
        <div class="piano-key sharp" data-key="84" data-letter="T" data-note="d♯"></div>
        <div class="piano-key sharp none"></div>
        <div class="piano-key sharp" data-key="85" data-letter="U" data-note="f♯"></div>
        <div class="piano-key sharp" data-key="73" data-letter="I" data-note="g♯"></div>
        <div class="piano-key sharp" data-key="79" data-letter="O" data-note="a♯"></div>
      </div>
    </div>

    <audio data-key="75" data-note="a" src="assets/audio/a.mp3"></audio>
    <audio data-key="79" data-note="a♯" src="assets/audio/a♯.mp3"></audio>
    <audio data-key="76" data-note="b" src="assets/audio/b.mp3"></audio>
    <audio data-key="68" data-note="c" src="assets/audio/c.mp3"></audio>
    <audio data-key="82" data-note="c♯" src="assets/audio/c♯.mp3"></audio>
    <audio data-key="70" data-note="d" src="assets/audio/d.mp3"></audio>
    <audio data-key="84" data-note="d♯" src="assets/audio/d♯.mp3"></audio>
    <audio data-key="71" data-note="e" src="assets/audio/e.mp3"></audio>
    <audio data-key="72" data-note="f" src="assets/audio/f.mp3"></audio>
    <audio data-key="85" data-note="f♯" src="assets/audio/f♯.mp3"></audio>
    <audio data-key="74" data-note="g" src="assets/audio/g.mp3"></audio>
    <audio data-key="73" data-note="g♯" src="assets/audio/g♯.mp3"></audio>

    <button class="fullscreen openfullscreen"></button>
  </main>
  <footer class="footer">
    <div class="footer-container">
      <a class="github" href="#" target="_blank" rel="noopener noreferrer">github</a>
      <a class="rss" href="https://rs.school/js/" target="_blank" rel="noopener noreferrer">
        <span class="rss-year">'21</span>
      </a>
    </div>
  </footer>
  <script src="script.js"></script>
</body>

</html>


Всем спасибо за помощь
  • Вопрос задан
  • 152 просмотра
Пригласить эксперта
Ответы на вопрос 1
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Вы функцию playAudio отдаете как event listener, в нее придет единственный аргумент - объект события, откуда должен взяться data - вообще не понятно.

Ну и вот так работать не будет:
piano.addEventListener("mousedown", startKeyActive, playAudio);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы