В JavaScript события - это действия, которые происходят в приложении. Они запускаются различными вещами, такими как ввод данных, отправка форм и изменения в элементе, такие как изменение размера, или ошибки, возникающие при запуске приложения и т. Д. Мы можем назначить обработчик событий для обработки этих событий. События, происходящие с элементами DOM, можно обрабатывать путем назначения обработчика событий свойствам объекта DOM для соответствующих событий. В этой статье мы рассмотрим обработчики событий ondragleave
и ondragover
и их использование.
Ondragleave
Свойство ondragleave
элемента DOM позволяет нам установить функцию обработчика события для обработки события dragleave
. Событие dragleave
запускается, когда перетаскиваемый элемент или выделенный текст оставляют допустимую цель перетаскивания. Например, мы можем проверить, откуда перемещается перетаскиваемый блок, добавив следующий HTML-код:
<p id='drag-leave-tracker'> </p> <div id='drag-box' draggable="true"> </div> <div id='drop-zones'> <div id='drop-zone'> </div> <div id='drop-zone-2'> </div> </div>
Приведенный выше код лучше, чем передача dragBox
непосредственно в appendChild
, поскольку он гораздо более универсален, чем исходная версия функции обработчика событий. Мы можем прикрепить его к любому перемещаемому объекту, который захотим. Например, если у нас есть более одного перетаскиваемого элемента div
, как в следующем HTML-коде:
<div id='drag-box' draggable="true"> </div> <div id='drag-box-2' draggable="true"> </div> <div id='drop-zone'> </div>
И мы меняем CSS, чтобы стилизовать оба перетаскиваемых элемента div
, как в приведенном ниже коде:
#drag-box { width: 100px; height: 100px; background-color: red; } #drag-box-2 { width: 100px; height: 100px; background-color: green; } #drop-zone { width: 200px; height: 200px; background-color: purple }
Затем мы можем написать следующий код JavaScript, чтобы использовать одну функцию обработчика событий ondragleave
для обработки удаления обоих перетаскиваемых элементов div
, как в приведенном ниже коде:
const dragBox = document.getElementById('drag-box'); const dropZone = document.getElementById('drop-zone'); const dropZone2 = document.getElementById('drop-zone-2'); const dragLeaveTracker = document.getElementById('drag-leave-tracker'); const dragEnterHandler = (e) => { if (e.toElement.id.includes('drop-zone')) { e.toElement.appendChild(document.getElementById('drag-box')); } } const dragLeaveHandler = (e) => { if (e.toElement.id.includes('drop-zone')) { dragLeaveTracker.innerHTML = `Leaving ${e.target.id}`; } } dropZone.ondragenter = dragEnterHandler; dropZone.ondragleave = dragLeaveHandler; dropZone2.ondragenter = dragEnterHandler; dropZone2.ondragleave = dragLeaveHandler;
В приведенном выше коде мы создали функцию dragLeaveHandler
, которая имеет параметр e
с объектом DragEvent
для получения элемента DOM, от которого перемещаемый элемент перемещается. Он также может удаляться от самого себя, поскольку он также является допустимой целью для перетаскивания. Мы заботимся только о том, чтобы отойти от 2 drop-zone
div
элементов, поэтому мы добавили проверку, соответствует ли идентификатор элемента, от которого он удаляется, со строкой e.toElement.id.includes(‘drop-zone’)
. Затем мы устанавливаем свойство innerHTML
элемента dragLeaveTracker
DOM, чтобы отображать, от какого из 2 div
элементов удаляется drag-box
div
.
Кроме того, у нас есть dragEnterHandler
для обработки фактического перетаскивания элемента drag-box
в элемент drop-zone
div
с помощью метода appendChild
для добавления drag-box
внутри drop-zone
div
.
ондраговер
Мы можем назначить обработчик событий свойству ondragover
элемента DOM для обработки события dragover
, которое запускается, когда элемент или выделенный текст перетаскивается через допустимую цель перетаскивания каждые несколько сотен миллисекунд. Например, мы можем добавить следующий HTML-код, чтобы добавить элемент p
для отображения идентификатора элемента, в который перетаскивается перетаскиваемый элемент, перетаскиваемый элемент div
и 2 элемента div
, в которые мы можем перетащить перетаскиваемый элемент div
, написав следующий код:
<p id='drag-over-tracker'> </p> <div id='drag-box' draggable="true"> </div> <div id='drop-zones'> <div id='drop-zone'> </div> <div id='drop-zone-2'> </div> </div>
Затем мы стилизуем элементы, которые есть в коде HTML, изменяя цвет и размер каждого блока с помощью следующего кода CSS:
#drag-box { width: 100px; height: 100px; background-color: red; } #drop-zones { display: flex; } #drop-zone { width: 200px; height: 200px; background-color: purple } #drop-zone-2 { width: 200px; height: 200px; background-color: green; }
Мы помещаем 2 элемента div
, в которые мы можем перетащить наш перетаскиваемый div
, рядом, используя свойство и значение display: flex
. Затем мы можем назначить нашу собственную функцию обработчика событий свойству ondragover
наших 2 div
элементов, куда мы можем перетащить наш перетаскиваемый элемент div
, написав следующий код:
const dragBox = document.getElementById('drag-box'); const dropZone = document.getElementById('drop-zone'); const dropZone2 = document.getElementById('drop-zone-2'); const dragOverTracker = document.getElementById('drag-over-tracker'); const dragEnterHandler = (e) => { if (e.toElement.id.includes('drop-zone')) { e.toElement.appendChild(document.getElementById('drag-box')); } } const dragOverHandler = (e) => { console.log(e); if (e.toElement.id.includes('drop-zone')) { dragOverTracker.innerHTML = `Dragging over ${e.target.id}, coordinate (${e.clientX}, ${e.clientY})`; } } dropZone.ondragenter = dragEnterHandler; dropZone.ondragover = dragOverHandler; dropZone2.ondragenter = dragEnterHandler; dropZone2.ondragover = dragOverHandler;
В приведенном выше коде у нас есть функция dragOverHandler
для обработки события dragover
для элементов drop-zone
и drop-zone-2
div
. Когда элемент drag-box
div
перетаскивается на один из элементов drop-zone
div
, мы можем видеть, что оператор console.log
внутри функции dragOverHandler
выводит данные несколько раз, если мы удерживаем drag-box
div
над любым из drop-zone
divs
. Это связано с тем, что событие dragover
запускается каждые несколько миллисекунд, когда мы перетаскиваем перетаскиваемый элемент на допустимую цель перетаскивания, которой являются 2 элемента drop-zone
div
. Пока мы перетаскиваем его на любой из 2 элементов div
, мы будем видеть новый результат console.log
. Кроме того, когда мы перемещаем drag-box
внутри любого из 2 элементов drop-zone
div
, координата, в которой drag-box
на экране, также будет обновляться, поскольку он перемещается с помощью мыши или сенсорного экрана. Мы увидим идентификатор элемента div
, который перетаскивается drag-box
, получив значение свойства e.toElement.id
, а также мы получим идентификатор, который drag-box
перетаскивает, из параметра e
. Параметр e
- это объект DragEvent
, который имеет такие свойства, как координаты перетаскивания с помощью свойств clientX
и clientY
, а также элемент, который перетаскивается с помощью свойства toElement
.
Кроме того, у нас есть dragEnterHandler
для обработки фактического перетаскивания элемента drag-box
в элемент drop-zone
div
, используя метод appendChild
для добавления drag-box
внутри drop-zone
div
.
Свойство ondragleave
элемента DOM позволяет нам установить функцию обработчика события для обработки события dragleave
. Событие dragleave
запускается, когда перетаскиваемый элемент или выделенный текст оставляет допустимую цель перетаскивания. Это удобно для того, чтобы узнать, из какого целевого элемента перетаскивается перетаскиваемый элемент. Мы можем назначить обработчик событий свойству ondragover
элемента DOM для обработки события dragover
, которое запускается, когда элемент или выделенный текст перетаскивается через допустимую цель перетаскивания каждые несколько сотен миллисекунд. Это удобно для определения того, какой элемент мы перетаскиваем, а также для получения координат на экране, в котором находится перетаскиваемый элемент.