HTML5 - перетаскивание
Drag and Drop (DnD) - это мощная концепция пользовательского интерфейса, которая упрощает копирование, изменение порядка и удаление элементов с помощью щелчков мыши. Это позволяет пользователю щелкнуть и удерживать кнопку мыши над элементом, перетащить его в другое место и отпустить кнопку мыши, чтобы поместить элемент туда.
Чтобы добиться функциональности перетаскивания с помощью традиционного HTML4, разработчикам придется либо использовать сложное программирование на JavaScript, либо другие инфраструктуры JavaScript, такие как jQuery и т. Д.
Теперь в HTML 5 появился API Drag and Drop (DnD), который обеспечивает встроенную поддержку DnD в браузере, что значительно упрощает кодирование.
HTML 5 DnD поддерживается всеми основными браузерами, такими как Chrome, Firefox 3.5, Safari 4 и т. Д.
События перетаскивания
Есть ряд событий, которые запускаются на различных этапах операции перетаскивания. Эти события перечислены ниже -
Sr.No. | События и описание |
---|---|
1 | dragstart Срабатывает, когда пользователь начинает перетаскивать объект. |
2 | dragenter Срабатывает, когда мышь впервые наводится на целевой элемент во время перетаскивания. Слушатель этого события должен указать, разрешено ли отбрасывание в этом месте. Если слушателей нет или слушатели не выполняют никаких операций, то удаление по умолчанию не разрешено. |
3 | dragover Это событие запускается, когда мышь перемещается по элементу при перетаскивании. В большинстве случаев операция, выполняемая во время прослушивания, будет такой же, как событие dragenter. |
4 | dragleave Это событие запускается, когда мышь покидает элемент во время перетаскивания. Слушатели должны удалить любые маркеры выделения или вставки, используемые для обратной связи. |
5 | drag Срабатывает каждый раз при перемещении мыши во время перетаскивания объекта. |
6 | drop Событие перетаскивания запускается для элемента, на котором произошло перетаскивание в конце операции перетаскивания. Слушатель будет отвечать за извлечение перетаскиваемых данных и их вставку в место перетаскивания. |
7 | dragend Срабатывает, когда пользователь отпускает кнопку мыши при перетаскивании объекта. |
Note- Обратите внимание, что запускаются только события перетаскивания; события мыши, такие как mousemove , не запускаются во время операции перетаскивания.
Объект DataTransfer
Методы прослушивателя событий для всех событий перетаскивания принимают Event объект, который имеет атрибут только для чтения, называемый dataTransfer.
В event.dataTransfer возвращается DataTransfer объект, связанный с событием следующим образом -
function EnterHandler(event) {
DataTransfer dt = event.dataTransfer;
.............
}
Объект DataTransfer содержит данные об операции перетаскивания. Эти данные можно получить и установить с помощью различных атрибутов, связанных с объектом DataTransfer, как описано ниже:
Sr.No. | Атрибуты DataTransfer и их описание |
---|---|
1 | dataTransfer.dropEffect [ = value ]
|
2 | dataTransfer.effectAllowed [ = value ]
|
3 | dataTransfer.types Возвращает список DOMStringList, в котором перечислены форматы, заданные в событии dragstart. Кроме того, если перетаскиваются какие-либо файлы, то одним из типов будет строка «Файлы». |
4 | dataTransfer.clearData ( [ format ] ) Удаляет данные указанных форматов. Удаляет все данные, если аргумент не указан. |
5 | dataTransfer.setData(format, data) Добавляет указанные данные. |
6 | data = dataTransfer.getData(format) Возвращает указанные данные. Если таких данных нет, возвращает пустую строку. |
7 | dataTransfer.files Возвращает FileList перетаскиваемых файлов, если таковые имеются. |
8 | dataTransfer.setDragImage(element, x, y) Использует данный элемент для обновления обратной связи перетаскивания, заменяя любую ранее указанную обратную связь. |
9 | dataTransfer.addElement(element) Добавляет указанный элемент в список элементов, используемых для отображения обратной связи при перетаскивании. |
Процесс перетаскивания
Ниже приведены шаги, которые необходимо выполнить для реализации операции перетаскивания.
Шаг 1 - Делаем объект перетаскиваемым
Вот шаги, которые необходимо предпринять -
Если вы хотите перетащить элемент, вам нужно установить draggable приписывать true для этого элемента.
Установите прослушиватель событий для dragstart в котором хранятся перетаскиваемые данные.
Слушатель событий dragstart установит разрешенные эффекты (копирование, перемещение, ссылка или некоторая комбинация).
Ниже приведен пример, как сделать объект перетаскиваемым.
<!DOCTYPE HTML>
<html>
<head>
<style type = "text/css">
#boxA, #boxB {
float:left;padding:10px;margin:10px; -moz-user-select:none;
}
#boxA { background-color: #6633FF; width:75px; height:75px; }
#boxB { background-color: #FF6699; width:150px; height:150px; }
</style>
<script type = "text/javascript">
function dragStart(ev) {
ev.dataTransfer.effectAllowed = 'move';
ev.dataTransfer.setData("Text", ev.target.getAttribute('id'));
ev.dataTransfer.setDragImage(ev.target,0,0);
return true;
}
</script>
</head>
<body>
<center>
<h2>Drag and drop HTML5 demo</h2>
<div>Try to drag the purple box around.</div>
<div id = "boxA" draggable = "true"
ondragstart = "return dragStart(ev)">
<p>Drag Me</p>
</div>
<div id = "boxB">Dustbin</div>
</center>
</body>
</html>
Это даст следующий результат -
Шаг 2 - Отбрасывание объекта
Чтобы принять перетаскивание, цель перетаскивания должна прослушать как минимум три события.
В dragenterсобытие, которое используется для определения того, должна ли цель перетаскивания принять перетаскивание. Если сброс должен быть принят, то это событие должно быть отменено.
В dragoverсобытие, которое используется для определения того, какая обратная связь будет показана пользователю. Если событие отменено, то обратная связь (обычно курсор) обновляется на основе значения атрибута dropEffect.
Наконец, drop событие, которое позволяет выполнить сброс.
Ниже приведен пример перетаскивания объекта в другой объект.
<html>
<head>
<style type="text/css">
#boxA, #boxB {
float:left;padding:10px;margin:10px;-moz-user-select:none;
}
#boxA { background-color: #6633FF; width:75px; height:75px; }
#boxB { background-color: #FF6699; width:150px; height:150px; }
</style>
<script type="text/javascript">
function dragStart(ev) {
ev.dataTransfer.effectAllowed='move';
ev.dataTransfer.setData("Text", ev.target.getAttribute('id'));
ev.dataTransfer.setDragImage(ev.target,0,0);
return true;
}
function dragEnter(ev) {
event.preventDefault();
return true;
}
function dragOver(ev) {
return false;
}
function dragDrop(ev) {
var src = ev.dataTransfer.getData("Text");
ev.target.appendChild(document.getElementById(src));
ev.stopPropagation();
return false;
}
</script>
</head>
<body>
<center>
<h2>Drag and drop HTML5 demo</h2>
<div>Try to move the purple box into the pink box.</div>
<div id="boxA" draggable="true" ondragstart="return dragStart(event)">
<p>Drag Me</p>
</div>
<div id="boxB" ondragenter="return dragEnter(event)" ondrop="return dragDrop(event)" ondragover="return dragOver(event)">Dustbin</div>
</center>
</body>
</html>
Это даст следующий результат -