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

В этой статье мы рассмотрим, как этого добиться с помощью ванильного JavaScript.

Прежде всего, давайте подробнее рассмотрим необходимую разметку HTML.

<input type=”fileaccept=”.jpg, .jpeg, .png” id="file-upload"> 
<img src="#" alt="Preview Uploaded Image" id="file-preview">

Как вы могли заметить, тип ввода должен быть установлен на файл. Также желательно установить значения атрибута accept. Другие допустимые способы вставки значений для принятия атрибута: image/jpg, image/gif или просто image/*. Последний позволит загружать на страницу файлы с любым расширением изображения.

Атрибут id file-preview внутри тега img будет использоваться для получения элемента с помощью Javascript, чтобы мы могли загрузить туда изображение.

После этого мы можем перейти к части JavaScript, где нам нужно сначала получить элемент ввода, а затем добавить к нему прослушиватель событий.

const input = document.getElementById(‘file-upload’);
input.addEventListener('change', previewPhoto);

Приемник событий Change срабатывает каждый раз, когда пользователь выбирает изображение. Именно тогда мы хотим, чтобы наше изображение стало видимым на странице. Именно для этого будет вызвано функциональное выражение с именем previewPhoto.

const previewPhoto = () => {
    const file = input.files;
    if (file) {
        const fileReader = new FileReader();
        const preview = document.getElementById('file-preview');
        fileReader.onload = event => {
            preview.setAttribute('src', event.target.result);
        }
        fileReader.readAsDataURL(file[0]);
    }
}

В этом функциональном выражении мы создаем объект new FileReader, который позволяет нам читать файлы, хранящиеся на машине пользователя, которые пользователь выбрал через файл типа ввода.

После загрузки объекта event.target.result будет содержать загружаемый URL-адрес в результате вызванного метода readAsDataURL. Этот URL-адрес, в свою очередь, может быть передан в качестве второго аргумента внутри метода setAttribute для желаемого объекта.

Наконец, мы можем ожидать, что наш JavaScript будет выглядеть так:

const input = document.getElementById('file-input');
const previewPhoto = () => {
    const file = input.files;
    if (file) {
        const fileReader = new FileReader();
        const preview = document.getElementById('file-preview');
fileReader.onload = function (event) {
            preview.setAttribute('src', event.target.result);
        }
        fileReader.readAsDataURL(file[0]);
    }
}
input.addEventListener("change", previewPhoto);

При условии, что мы вызываем функциональное выражение, а не функцию после возникновения события change. Важно, чтобы наш прослушиватель событий располагался ниже инициализированного выражения, поскольку подъем работает в JavaScript.

Теперь вы можете успешно просмотреть изображение на экране после того, как оно было выбрано.