@djok2142

Загрузка файлов с помощью Drag and drop, как разово отследить когда курсор с файлом пересекает границу окна браузера?

Добрый день.
Подскажите пожалуйста. При перетаскивании файла в браузер, так званный "Drag and drop", как разово отследить события когда курсор мыши с файлом пересекает границу окна браузера, а так же событие когда курсор мыши с файлом покидает границы браузера (пользователь передумал, загружать файл)?
Пробовал отслеживать события dragenter и dragleave;

$("body").on('dragenter',  function(e) {
	console.log('Старт перетаскивания');
});
$(document).on('dragleave', function(e) {
	console.log('Окончание перетаскивания');
});

Однако они срабатывают многократно, пока курсор мыши движется по сайту пересекает границы вложенных в body элементов.
Как в данном случае быть?

Нужный вариант реализации встречал например на сайте https://ru.imgbb.com/, там при перетаскивании файла в окно браузера единожды срабатывает событие "dragenter", и пока водишь по сайту курсором с файлом он более не срабатывает, и так же когда курсор покидает окно браузера, единожды срабатывает событие "dragleave".
Но к сожалению js там минифицирован, и я не смог разобраться как реализован механизм, отсекающий все остальные срабатывания данных событий.
  • Вопрос задан
  • 60 просмотров
Решения вопроса 1
@djok2142 Автор вопроса
var is_file_drag = false; // Если курсор с файлом находится в пределах окна браузер тогда true иначе false
var file_drag_target = false; // Элемент над которым в данный момент находится курсор с файлом

$('body').on('dragenter', function(e) {
  file_drag_target = e.target;
  if( is_file_drag ) return;
  is_file_drag = true;

  // Данный код будет выполнен когда курсор с файлом войдет в пределы окна браузера
  // .....
});

$('body').on('dragleave', function(e){
  if( e.target == file_drag_target) { // Если true, значит курсор с файлом покинул окно браузера, а не перешел на другой элемент
    is_file_drag = false;
      
    // Данный код будет выполнен когда курсор с файлом покинет пределы окна браузера
    // .....
  }
});
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Stalker_RED
@Stalker_RED
Событие от вложенных элементов всплывает же.
document.body.addEventListener('dragenter', function(e) {
  console.log('Старт перетаскивания', e.target);
});

Можете проверять где именно оно было сгенерировано.
if (e.taget.matches('body')) { }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы