Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Атрибут dropzone не нужен.
// добавляем подсказкуПодсказку в консоль? Не очень хорошая идея, лучше текстом или при наведении на иконку.
console.log(
" Use Keyboard: \n Space to Play/Pause \n Enter to Stop \n Arrows to Change \n Time and Volume"
);
$ = C.getContext(«2d»)Имя переменной по-моему неудачное. Можно подумать, что используется jQuery.
необходимость использования try/catch обусловлена странным поведением Chrome, связанным с вычислением громкости звука. Попробуйте убрать try/catch и выводить в консоль громкость звука (console.log(audio.volume)) после каждого изменения при приближении к 0 и 1 (согласно спецификации значение громкости звука варьируется от 0.1 до 1) получаем странные значения, которые нивелируют проверки типа if(audio.volume>0 && audio.volume<1). Использование в проверках «неточных» значений вроде 0.1 и 0.9 решает проблему исключений, но приводит к некорректному изменению громкости звука. Исключения работе плеера не мешают, но раздражаютМне стало интересно, я попробовал воспроизвести и не совсем понял в чем заключается «странное поведение»: у меня в Chrome
console.log(audio.volume) выдает предсказуемые значения в диапазоне (0;1]. А такое решение у вас работает или тоже падает/ведет себя странно?согласно спецификации значение громкости звука варьируется от 0.1 до 1Нет, от 0 до 1.
document.addEventListener("keydown", e => {
if (e.keyCode == 32) {
audio.paused ? audio.play() : audio.pause();
} else if (e.keyCode == 13) {
audio.load();
} else if (e.keyCode == 39) {
audio.currentTime += 10;
} else if (e.keyCode == 37) {
audio.currentTime -= 10;
} else if (e.keyCode == 40) {
audio.volume -= 0.1;
console.log(audio.volume)
} else if (e.keyCode == 38) {
audio.volume += 0.1;
console.log(audio.volume)
}
});

document.addEventListener("keydown", e => {
if (e.keyCode == 32) {
audio.paused ? audio.play() : audio.pause();
} else if (e.keyCode == 13) {
audio.load();
} else if (e.keyCode == 39) {
audio.currentTime += 10;
} else if (e.keyCode == 37) {
audio.currentTime -= 10;
} else if (e.keyCode == 40) {
audio.volume = clampNumber(audio.volume - 0.1);
} else if (e.keyCode == 38) {
audio.volume = clampNumber(audio.volume + 0.1);
}
});

Number.MIN_SAFE_INTEGER до Number.MAX_SAFE_INTEGER и как будто бы ожидать от number поведение, свойственное для integer в других языках: 123 + 456 == 579 строго. И это ослабляет бдительность. Ведь по-прежнему 0.1 + 0.2 == 0.30000000000000004Результат такой же, как при использовании try/catch, но пришлось написать целую функцию
catch(everyErrorIDontCare) { return; }try {
audio.volume = 1.1;
} catch (err) {
if (err instanceof DOMException && err.name === 'IndexSizeError') {
return;
} else {
throw err; // pass any other unhandled error
}
}
clampNumber() — вполне self-explaining code. Ведь вам сам API как бы говорит: «программист, позаботься о том, чтобы громкость была в интервале от 0 до 1, иначе я ломаюсь».А можно такое же, но для бесконечного радиопотока? :)
Работаем с аудио: прогресс и визуализация данных