Задать вопрос
Пользователь пока ничего не рассказал о себе

Наибольший вклад в теги

Все теги (1)

Лучшие ответы пользователя

Все ответы (1)
  • Как удалить файл из числа прикрепленных?

    @Nawot
    Можно скопировать все файлы кроме удаленного из input в DataTransfer, а потом обратно в input
    Вот код из моего проекта:
    const loaders = document.querySelectorAll('.file-loader')
    
    loaders.forEach((loader) =>
    {
        const dropBox = loader.querySelector('.file-loader__input-wrapper')
        const input = loader.querySelector('.file-loader__input')
        const files = loader.querySelector('.file-loader__files')
    
    
        const refreshFiles = () =>
        {
            // Clear files
            files.innerHTML = ''
    
            // Make all files
            Array.from(input.files).forEach(file =>
            {
                const el = document.createElement('li')
                el.classList.add('file-lader__file')
                el.classList.add('file-loader-file')
    
                const elName = document.createElement('span')
                const elDelete = document.createElement('span')
    
                elName.classList.add('file-loader-file__name')
                elDelete.classList.add('file-loader-file__delete')
                elDelete.addEventListener('click', e =>
                {
                    deleteFile(e.target.parentNode)
                })
    
                elName.textContent = file.name
                elDelete.textContent = 'Удалить файл'
    
                el.appendChild(elName)
                el.appendChild(elDelete)
    
                files.appendChild(el)
            })
        }
    
        const deleteFile = (element) =>
        {
            let dt = new DataTransfer()
            const index = getChildElementIndex(element)
    
            // Copy all besides deleted
            for(let i=0; i<=input.files.length-1; i++)
                if(i !== index)
                    dt.items.add(input.files[i])
    
            // Replace
            input.files = dt.files
    
            refreshFiles()
        }
    
        function getChildElementIndex(element)
        {
            return Array.prototype.indexOf.call(element.parentNode.children, element)
        }
    
    
        dropBox.addEventListener('drop', e =>
        {
            input.files = e.dataTransfer.files
    
            refreshFiles()
            e.preventDefault()
        })
        input.addEventListener('change', e =>
        {
            refreshFiles()
            e.preventDefault()
        })
    })
    Ответ написан
    Комментировать