Делаю drag and drop файла на чистом JS и возникла проблема с ивентом DragEnter. Мне нужно отловить Event , то что я начал перемещать файлы в окно браузера и показать зону , куда нужно закидывать эти файлы. Примером служит старый и добрый ВК. Но проблема в том что dragenter срабатывает и на обычный выделенный текст , если его начинать перемещать и показывается тоже самое окно.
Сам код
if (this.determineDragAndDropCapable()) { //Проверка на поддержку браузером
var eventTarget = null;
['dragend', 'dragover', 'dragenter', 'dragleave', 'drop'].forEach(event => {
window.addEventListener(event, e => {
e.preventDefault();
});
});
window.addEventListener('dragenter', e => {
eventTarget = e.target;
this.dragAndDropFiles = true;
});
window.addEventListener('dragleave', e => {
if (eventTarget == e.target) {
this.dragAndDropFiles = false;
}
});
this.$refs.dragAndDropZone.addEventListener('dragover', e => {
e.dataTransfer.dropEffect = 'copy';
});
window.addEventListener('drop', e => {
this.dragAndDropFiles = false;
if (e.target == this.$refs.dragAndDropZone) {
this.handleFileUpload(e.dataTransfer.files);
}
});
}
Ссылка на gif изображение для ясности ситуации: https://i.yapx.ru/EPrqN.gif
Подскажите, может можно как-нибудь отлавливать ,то что я переношу файлы и только тогда показывать зону для дропа файла? Или может стоит написать кастомный drag and drop? Но пока что не знаю , как я могу это сделать
Любая помощь :) Заранее спасибо!
Решение:
var cancelDrag = false;
window.addEventListener('dragstart', e => {
cancelDrag = true;
});
window.addEventListener('dragend', e => {
cancelDrag = false;
});
window.addEventListener('dragenter', e => {
if (cancelDrag) return false;
eventTarget = e.target;
this.dragAndDropFiles = true;
});
window.addEventListener('dragleave', e => {
if (eventTarget == e.target) {
this.dragAndDropFiles = false;
}
});
this.$refs.dragAndDropZone.addEventListener('dragover', e => {
e.dataTransfer.dropEffect = 'copy';
});
window.addEventListener('drop', e => {
this.dragAndDropFiles = false;
if (e.target == this.$refs.dragAndDropZone) {
this.handleFileUpload(e.dataTransfer.files);
}
});
Продвижение своими сайтами как стратегия роста и независимости