События dragover и drop
Определяйте допустимые области сброса и обрабатывайте событие drop
«События 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 — локальная установка не требуется.
Все уроки этого курса
- Атрибут draggable и событие dragstart
- События dragover и drop
- Объект dataTransfer
- Практическая сортировка списка перетаскиванием