Петля при наведении курсора - PullRequest
0 голосов
/ 07 июня 2018

У меня есть четыре изображения.Когда я наведу на них курсор мыши, я хочу, чтобы каждый из них воспроизводил свой звук.Я сделал это, но создал разные переменные для каждой, а также разные функции.И в HTML у меня есть контейнер с изображениями, а затем в другом <div> аудио.Я создаю новую переменную, которая выбирает все изображения и зацикливает их:

var roll = document.querySelectorAll("img");
for (var i=0; i<roll.length; i++){
    roll[i].addEventListener("mouseover",function(){
       console.log(this);
       this.audio.play();
    })
}

Но тогда даже это «это» - это изображение, которое оно говорит: Cannot read property 'play' of undefined.И я путаюсь, как я соединяю звук с изображением.

HTML выглядит так:

<div class="container">
   <div class="down music"><img id="batman" src="#"></div>   
   <div class="up music"><img id="bane" src="#"></div>
   <div class="down music"><img id="batman" src="#"></div>
   <div class="up music"><img id="batman" src="#"></div>
</div>

<audio id="batman" src="sounds/batman.wav"></audio>
<audio id="bane" src="sounds/ceremony.mp3"></audio>
<audio id="joker" src="sounds/free.wav"></audio>
<audio id="alfred" src="sounds/mud.wav"></audio>

Ответы [ 4 ]

0 голосов
/ 07 июня 2018

Вот рабочий код в js:

 window.onload = function () {
      var roll = document.querySelectorAll("img");
      roll.forEach(function (img, i) {
            img.addEventListener("mouseover", function () {
                console.log(img);
                var indx = img.id.split('_').pop();
                playMusic(indx);
            });
        });
      }
 }
 function playMusic(indx) {
     var arr = ['sound_0', 'sound_1', 'sound_2', 'sound_3'];
     var audio = document.getElementsByTagName('audio')[0];
     audio.src = 'sounds/' + arr[indx] + '.wav';
     audio.play();
 }

и html:

<div class="container">
    <div class="up music"><img id="img_0" src="#"></div>
    <div class="up music"><img id="img_1" src="#"></div>
    <div class="down music"><img id="img_2" src="#"></div>
    <div class="up music"><img id="img_3" src="#"></div>
 </div>
 <audio src="sounds/mud.wav"></audio>
0 голосов
/ 07 июня 2018

Ваша проблема this относится к каждому тегу <img>, а не к источникам звука.Вот рабочий codepen , который onMouseOver предупреждает соответствующее значение div.(У меня не было доступа к источникам звука, но переключение должно быть относительно простым).Следующее должно работать для аудио тегов, если я не проверял это.

HTML:

<div class="container">
   <div class="down music"><img id="monkey" src="https://images.pexels.com/photos/145947/pexels-photo-145947.jpeg?auto=compress&cs=tinysrgb&h=350" height="90"></div>   
   <div class="up music"><img id="dog" src="https://boygeniusreport.files.wordpress.com/2016/11/puppy-dog.jpg?quality=98&strip=all&w=782" height="90"></div>
   <div class="down music"><img id="cat" src="https://www.bluecross.org.uk/sites/default/files/styles/thumbnail_pet/public/pets/149194.jpg?itok=xZLl3maM" height="90"></div>
   <div class="up music"><img id="cow" src="https://boygeniusreport.files.wordpress.com/2016/11/puppy-dog.jpg?quality=98&strip=all&w=782" height="90"></div>
</div>

<audio id="audiomonkey" src="#">monkey</audio>
<audio id="audiodog" src="#">dog</audio>
<audio id="audiocat" src="#">cat</audio>
<audio id="audiocow" src="#">cow</audio>

JavaScript:

var roll = document.querySelectorAll("img");
for (var i=0; i<roll.length; i++){
    roll[i].addEventListener("mouseover",function(){
       var idOfImg = this.id; //gets each id of the img
       document.getElementById("audio" + idOfImg).play(); //gets your right sound, based off id
    });
}

Мы получаем каждый идентификатор изображенияна this.id и затем получите соответствующий элемент с audio перед идентификатором, а затем просто используйте метод .play().

0 голосов
/ 07 июня 2018

Итак, вот что вы можете сделать: встроить каждый тег audio в теги div рядом с тегами img.Таким образом, у вас будет гораздо меньше проблем с поиском соответствующего элемента audio, когда вы активируете один из элементов img.

Вот новая структура:

<div class="container">
  <div class="down music">
    <img id="batman" src="#">
    <audio id="batman" src="sounds/batman.wav"></audio>
  </div>
  <div class="up music">
    <img id="bane" src="#">
    <audio id="bane" src="sounds/ceremony.mp3"></audio>
  </div>
  <div class="down music">
    <img id="joker" src="#">
    <audio id="joker" src="sounds/free.wav"></audio>
  </div>
  <div class="up music">
    <img id="alfred" src="#">
    <audio id="alfred" src="sounds/mud.wav"></audio>
  </div>
</div>

Осторожнос идентификаторами, но здесь это не имеет значения, так как мы не собираемся их использовать.

Далее, с помощью JavaScript, мы будем:

  1. выбрать всю музыку div s:

    const roll = [...document.querySelectorAll('.music')];
    

    Я использую деструктуризациюсинтаксис для преобразования NodeList из HTMLElement с в объект Array из HTMLElement с.

  2. Цикл всех элементов этого массива, т. е. все воспроизведение div s.Вместо использования цикла for я использую метод .map непосредственно в массиве.Это намного лучше.Метод создает новый массив с результатами вызова предоставленной функции обратного вызова для каждого элемента в roll.

    roll.map(function callback())
    

    Аргумент, переданный обратному вызову, является элементом roll (здесь он называется * 1039).*)

  3. В функции обратного вызова мы используем querySelector для e, чтобы найти дочерний элемент img.Затем мы подключаем к нему прослушиватель событий:

    e.querySelector('img').addEventListener('mouseover', function insideCallback());
    
  4. addEventListener также требуется функция обратного вызова.Он просто выберет дочерний элемент audio и вызовет для него метод play():

    e.querySelector('img').addEventListener('mouseover', () => {
    
        e.querySelector('audio').play()
    
    });
    

Итак, окончательный код:

const roll = [...document.querySelectorAll('.music')];

roll.map(e => {
  e.querySelector('img').addEventListener('mouseover', () => {

    e.querySelector('audio').play()

  });

});
<div class="container">
  <div class="down music">
    <img id="batman" src="#">
    <audio id="batman" src="sounds/batman.wav"></audio>
  </div>
  <div class="up music">
    <img id="bane" src="#">
    <audio id="bane" src="sounds/ceremony.mp3"></audio>
  </div>
  <div class="down music">
    <img id="joker" src="#">
    <audio id="joker" src="sounds/free.wav"></audio>
  </div>
  <div class="up music">
    <img id="alfred" src="#">
    <audio id="alfred" src="sounds/mud.wav"></audio>
  </div>
</div>
0 голосов
/ 07 июня 2018

есть несколько проблем с вашим кодом:

  1. идентификаторы повторяются - идентификатор элементов HTML должен быть уникальным - это означает, что вы можете иметь только один элемент для данногоid, вместо этого используйте классы.
  2. как, по вашему мнению, this.audio.play() будет работать при переборе простых элементов HTML?

вам необходимо:

  1. удалите двусмысленные идентификаторы - замените их классами
  2. реализуйте способ чтения этих пользовательских свойств и воспроизведения заданной песни
...