Как использовать <input> для сохранения загруженного в переменную javascript?

Я пытаюсь научиться использовать входной тег загрузки, чтобы брать аудиофайлы и воспроизводить их.

В моем HTML у меня есть ввод:

<h3>Upload Song: <input id = "song" type = "file" accept = "audio/*" oninput = "updateSong()"></input></h3>

Идея состоит в том, что как только песня загружается с компьютера пользователя, вызывается функция updateSong(), и система автоматически сохраняет песню как var в javascript.

Это можно сделать с помощью функции updateSong():

function updateSong(){
  song = document.getElementById("song");
  console.info(song)
  song.value.play();
}
var song;

Затем, как только песня будет сохранена, я хотел бы, чтобы она воспроизводилась — просто в качестве теста, чтобы я знал, что она работает.

Однако, когда я использую этот код для реализации своей идеи, я получаю сообщение об ошибке:

TypeError: song.value.play is not a function
    at updateSong (/script.js:32:14)
    at HTMLInputElement.oninput (/:17:91)

Какую идею я упускаю из-за того, что код не запускается? Я установил песню, а затем обновил переменную с песней. Это кажется простым, поэтому я не уверен, почему это не работает.

song — это <input>, а не файл. Не могу сыграть <input>. Узнайте, как читать файлы и как преобразовывать их в элементы dom.
charlietfl 16.07.2019 01:32

Значит, type = "file" не сообщает компьютеру, что это файл?

Jackson Ennis 16.07.2019 01:35

Нет... он сообщает браузеру, что это входные данные, что файлы принимает

charlietfl 16.07.2019 01:37
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
3
83
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Входной файл имеет files недвижимость, что позволяет перечислить его список файлов.

Оттуда вы можете использовать URL.createObjectURL для создания временного URL-адреса объекта в стиле BLOB-объектов, который ссылается на файл с компьютера пользователя.

С помощью этого URL-адреса вы можете создать новый экземпляр Audio элемент и начать воспроизведение. Например:

document.querySelector('input[type = "file"]').addEventListener('input', (e) => {
  console.info(e.target.files);
  if (e.target.files.length) {
    const audio = new Audio(
      URL.createObjectURL(e.target.files[0])
    );
    audio.play();
  }
});

(JSFiddle: https://jsfiddle.net/6tkxw0aj/)

Не забудьте отозвать URL вашего объекта позже, когда закончите!

Другие вопросы по теме