Как использовать функцию перетаскивания HTML5 с FileSystemAPI?
Я использую FileSystemAPI window.showDirectoryPicker (), чтобы открыть каталог, который возвращает дескриптор этого каталога, и с его помощью я могу просматривать все файлы, присутствующие в этом каталоге.
const dropArea = document.getElementById("drop_zone");
dropArea.onclick = async (evt) => {
const dirHandle = await window.showDirectoryPicker();
// Next lines of code using dirHandle
};
Вышеупомянутый фрагмент кода работает нормально при нажатии кнопки, предлагающей пользователю выбрать каталог. Я хочу добиться той же функциональности с помощью перетаскивания, это означает, что вместо того, чтобы щелкнуть и выбрать каталог, пользователь может удалить каталог.
Перешел по ссылке ниже, но у меня это не сработало.
Буду признателен за любую помощь или информацию по этому поводу. Спасибо!
1 ответ
Интерфейсы HTML Drag and Drop позволяют веб-приложениям принимать перетаскиваемые файлы на веб-страницу. Во время операции перетаскивания перетаскиваемые элементы файла и каталога связываются с записями файлов и записями каталога соответственно. В
DataTransferItem.getAsFileSystemHandle()
метод возвращает обещание с
FileSystemFileHandle
объект, если перетаскиваемый элемент является файлом, и обещание с
FileSystemDirectoryHandle
объект, если перетаскиваемый элемент является каталогом. Приведенный ниже листинг демонстрирует это в действии. Обратите внимание, что интерфейс перетаскиванияDataTransferItem.kind
будет как для файлов, так и для каталогов, тогда как API доступа к файловой системеFileSystemHandle.kind
будет
"file"
для файлов и
"directory"
для справочников.
elem.addEventListener('dragover', (e) => {
// Prevent navigation.
e.preventDefault();
});
elem.addEventListener('drop', async (e) => {
// Prevent navigation.
e.preventDefault();
// Process all of the items.
for (const item of e.dataTransfer.items) {
// Careful: `kind` will be 'file' for both file
// _and_ directory entries.
if (item.kind === 'file') {
const entry = await item.getAsFileSystemHandle();
if (entry.kind === 'directory') {
handleDirectoryEntry(entry);
} else {
handleFileEntry(entry);
}
}
}
});