Как можно последовательно загружать изображения, показывать их предпросмотр и давать возможность удалять их по запросу с помощью JavaScript?

Как можно решить две основные проблемы в сгенерированном коде JavaScript, который предназначен для добавления изображений пользователями в форму и их предварительного просмотра? Первая проблема заключается в том, что при удалении изображений индексы файлов в поле ввода или кнопок в блоке предварительного просмотра изменяются, что может вызвать проблемы при удалении изображений не по порядку. Вторая проблема состоит в том, что при последовательном добавлении изображений существующие файлы автоматически удаляются. Как можно сохранить изображения не только в блоке предварительного просмотра, но и в действительности, чтобы файлы оставались в поле ввода? Как можно изменить код JavaScript, чтобы обойти эти проблемы?
  • 18 февраля 2024 г. 20:28
Ответы на вопрос 2
Для решения указанных проблем можно использовать следующий подход:

1. Создайте функцию для добавления изображений:
```javascript
function addImage(input) {
    if (input.files && input.files[0]) {
        var reader = new FileReader();
        reader.onload = function(e) {
            var preview = document.createElement("img");
            preview.src = e.target.result;
            preview.setAttribute("class", "image-preview");
            var deleteButton = document.createElement("button");
            deleteButton.innerText = "Delete";
            deleteButton.addEventListener("click", function() {
                preview.remove();
                input.value = "";
            });
            document.getElementById("image-preview-container").appendChild(preview);
            document.getElementById("image-preview-container").appendChild(deleteButton);
        }
        reader.readAsDataURL(input.files[0]);
    }
}
```

2. Измените функцию удаления изображений, чтобы она правильно удаляла соответствующие изображения и сохраняла их индексы:
```javascript
function deleteImage(index) {
    var preview = document.getElementById("image-preview-container");
    var images = preview.getElementsByClassName("image-preview");
    if (images.length > index) {
        images[index].remove();
    }
    var buttons = preview.getElementsByTagName("button");
    if (buttons.length > index) {
        buttons[index].remove();
    }
}
```

3. При каждом добавлении нового изображения вызывайте функцию `addImage(input)`, передавая ей элемент `input` с добавленным файлом. Также, добавьте кнопку для удаления каждого изображения с вызовом функции `deleteImage(index)` с соответствующим индексом.

Этот подход позволит сохранять изображения не только в блоке предварительного просмотра, но и в действительности, сохраняя файлы в поле ввода. Теперь при удалении изображения не нужно пересчитывать индексы, так как кнопки удаления имеют соответствующие функции.
Ответ на пункт первый. 
В данной конструкции почему вы привязываетесь к индексу, который не приравнивается к уникальному при удалении? Т. е. он не равен индексу удаляемого с индексом при создании нового списка файлов.
Лучше всего сравнивать по имени файла.
Ну и то, с чего должен быть вопрос - разместить код на codepen.io
Это хорошая практика и скорость получения ответа на много быстрее.
Ответ на пункт второй
Вы не можете добавлять файл к файлам уже выбранным в input
Но это можно реализовать... Конструкция и html и js здесь будет уже другая...
Похожие вопросы