Почему не работает событие play()?

151
04 апреля 2022, 17:20

Написал такой скрипт.

Предполагается, что при нажатии на кнопку voice-btn, в зависимости от ее id должен рандомно воспроизводиться один из 3х звуков. Но что-то ничего не работает, подскажите где я ошибся?

//Deer sounds 
let deer1 = new Audio('sounds/deer1.mp3'); 
let deer2 = new Audio('sounds/deer2.mp3'); 
let deer3 = new Audio('sounds/deer3.mp3'); 
//Fox sounds 
let fox1 = new Audio('sounds/fox1.mp3'); 
let fox2 = new Audio('sounds/fox2.mp3'); 
let fox3 = new Audio('sounds/fox3.mp3'); 
//Voice random selection 
function randomVoice() { 
    let rand = 1 + Math.random() * (4 - 1); 
    return Math.floor(rand); 
} 
//playingNow - воспроизводится ли звук 
let playingNow = false; 
//При нажатии на кнопку воспроизведения звука 
//Определяем на какую именно кнопу нажали (currentAnimal) 
//Рандомно выбираем номер звука 1-3 (voiceNumber) 
$('.voice-btn').click(function () { 
    let currentAnimal = $(this).attr('id'); 
    let voiceNumber = randomVoice(); 
    if (!playingNow){ 
        switch (voiceNumber) { 
            case 1: 
                playVoice(currentAnimal + '1'); 
                break; 
            case 2: 
                playVoice(currentAnimal + '2'); 
                break; 
            case 3: 
                playVoice(currentAnimal + '3'); 
                break; 
        } 
        playingNow = true; 
    } 
    //Воспроизводит выбранный выше звук 
    function playVoice(voice) { 
        voice.play(); 
    } 
    //Если один из звуков завершился 
    //разрешаем воспроизводить другой 
    (currentAnimal + '1').onended = function() { 
        playingNow = false 
    }; 
    (currentAnimal + '2').onended = function() { 
        playingNow = false 
    }; 
    (currentAnimal + '3').onended = function() { 
        playingNow = false 
    }; 
});
.voice-btn{ 
  background: #000; 
  color: #fff; 
  padding: 20px; 
  margin: 5px 0 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 
<div class="voice-btn" id="deer">Олень</div> 
<div class="voice-btn" id="fox">Лиса</div>

Answer 1

У вас вот тут получается строка

let currentAnimal = $(this).attr('id');

к ней прибавляется строка

currentAnimal + '1'

а потом вот тут вы пытаетесь вызвать метод play() у этой строки

voice.play();

само собой у строки (voice="deer1") нет такого метода

Как я понимаю вы предполагали что ваша строка (на пример "deer1") "превратиться" в имя переменной, и у этой переменной вызовется метод play(). По идее такое сделать можно, как вот тут https://stackoverflow.com/questions/5613834/convert-string-to-variable-name-in-javascript

Но в вашем случае лучше переложить Audio объекты из обычных переменных в какую нибудь структуру данных на пример

1) массив объектов

let sounds = [{name:"deer1", audio: new Audio('sounds/deer1.mp3')}]

получать вот так

sounds.find(x => x.name === "deer1").audio.play()

2) или в объект

let sounds = {"deer1": new Audio('sounds/deer1.mp3')}

получать вот так

sounds["deer1"].play()
READ ALSO
Как получить файлы из папки с помошью google api v.3?

Как получить файлы из папки с помошью google api v.3?

Как получить список фалов в папке с помошью Drive API v3 ?

148
Задача с конкатенацией строк

Задача с конкатенацией строк

Функция получает массив из целих чисел нужно последующие числа объединить через символ - и в конце вернуть строкуЯ почти решил задачу но есть...

79
Помогите понять структуру кода и решение задачи(многомерные массивы) [закрыт]

Помогите понять структуру кода и решение задачи(многомерные массивы) [закрыт]

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение

121