HTML Academy · Урок

События dragover и drop

Определяйте допустимые области сброса и обрабатывайте событие drop

Урок 2 из 413 шагов

«События dragover и drop» — бесплатный урок HTML Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения HTML Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс HTML Academy содержит 4 уроков всего.

Для целей сброса нужны два обработчика

Цель сброса должна обрабатывать и dragover, чтобы разрешить сброс, и drop, чтобы принять его. Без события dragover браузер отказывается инициировать сброс, поскольку стандартное поведение — считать, что ни один элемент не является целью сброса.

preventDefault обязателен

В обработчике события перетаскивания над целью необходимо вызвать e.preventDefault(). Это отменяет стандартное поведение браузера, отклоняющее сброс. Без этого курсор остаётся в состоянии «не разрешено», а событие сброса не возникает, что бы ни делал пользователь.

zone.addEventListener("dragover", (e) => {
  e.preventDefault();
});
zone.addEventListener("drop", (e) => {
  e.preventDefault();
  console.log(e.dataTransfer.getData("text/plain"));
});

Вход и выход при перетаскивании

Событие входа при перетаскивании возникает один раз, когда курсор входит в цель, а событие выхода — один раз, когда он её покидает. Используйте их для переключения визуальной подсветки «перетаскивание над целью»: добавляйте класс при входе и удаляйте при выходе, чтобы пользователь видел область, которая примет сбрасываемый объект.

Выход при перетаскивании срабатывает для дочерних элементов

Есть важная особенность: при перемещении курсора над дочерним элементом родитель сначала получает событие выхода, а затем дочерний элемент — событие входа. Используйте counter, увеличивая его при входе и уменьшая при выходе, и удаляйте подсветку только после того, как counter вернётся к нулю.

let counter = 0;
zone.addEventListener("dragenter", () => {
  counter++;
  zone.classList.add("over");
});
zone.addEventListener("dragleave", () => {
  counter--;
  if (counter === 0) zone.classList.remove("over");
});

Настройка dropEffect

Внутри обработчика перетаскивания над целью установите e.dataTransfer.dropEffect = "move" (или «копирование», «ссылка», «ничего»), чтобы управлять курсором и сообщить источнику, что произойдёт. Операция должна быть совместима с effectAllowed источника, иначе сброс будет отклонён.

Чтение данных при сбросе

В обработчике сброса вызовите e.dataTransfer.getData(format) с тем же типом MIME, который использовался в setData (обычно «текст без форматирования»). Затем найдите элемент по идентификатору, добавьте его в цель, обновите модель данных или выполните любое другое действие, необходимое приложению.

Предотвращение стандартного поведения при сбросе

В обработчике сброса также необходимо вызвать e.preventDefault(). Без этого браузер возвращается к стандартному поведению — для сброшенного адреса это означает переход по ссылке, который немедленно уничтожает состояние страницы.

Сброс с рабочего стола

Браузер преобразует файлы, перетащенные из OS, в событие сброса, в котором заполнено свойство e.dataTransfer.files. Переберите FileList и прочитайте каждый файл с помощью API файлов, чтобы поддерживать загрузку изображений, просмотрщики файлов журналов или импорт документов.

zone.addEventListener("drop", (e) => {
  e.preventDefault();
  for (const file of e.dataTransfer.files) {
    console.log(file.name, file.size);
  }
});

Несколько типов в dataTransfer

setData может сохранять одни и те же данные под несколькими типами MIME: «текст без форматирования» для запасного варианта, «список URI» для адресов и «структурированные данные» для данных в формате JSON. Цель сброса выбирает наиболее подходящий тип, который она понимает, с помощью getData.

Согласование с сенсорными событиями

Мобильные браузеры не создают события перетаскивания над целью и сброса на основе касаний. Для единого взаимодействия используйте события указателя с ручным определением попадания или библиотеку, скрывающую различия. Встроенное перетаскивание HTML5 лучше считать предназначенным только для настольных устройств.

Совет по производительности

Событие перетаскивания над целью возникает непрерывно при движении курсора — часто десятки раз в секунду. Не усложняйте обработчик: избегайте дорогих запросов к DOM и чтения данных о компоновке внутри него. Кэшируйте прямоугольники при входе курсора и используйте их повторно, пока курсор находится над целью.

Проверка знаний

Почему событие сброса никогда не возникает для цели, пока вы не вызовете e.preventDefault() в обработчике перетаскивания над целью?

Итоги

Рабочая цель сброса обрабатывает перетаскивание над целью (всегда вызывает preventDefault и при необходимости устанавливает dropEffect) и сброс (снова вызывает preventDefault, затем читает данные через dataTransfer.getData или dataTransfer.files). Используйте вход и выход при перетаскивании вместе с counter для подсветки и не усложняйте обработчики, поскольку событие перетаскивания над целью возникает очень часто.

Можно начать бесплатно

Изучай HTML с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
40
Уроки
159

Часто задаваемые вопросы

Урок «События dragover и drop» бесплатный?

Да — полный текст урока «События dragover и drop» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс HTML Academy, подпишись на CoddyKit PRO. Курс HTML Academy содержит 4 уроков всего.

Чему я научусь в уроке «События dragover и drop»?

Определяйте допустимые области сброса и обрабатывайте событие drop Ты практикуешь HTML Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать HTML Academy?

Предыдущий опыт не требуется. HTML Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «События dragover и drop»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке HTML Academy?

Да. Каждый урок HTML Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Атрибут draggable и событие dragstart
  2. События dragover и drop
  3. Объект dataTransfer
  4. Практическая сортировка списка перетаскиванием
← Назад к HTML Academy