AJAX загрузка
home

В этой главе Вы узнаете о новой технологии HTML5 drag and drop.

Drag and Drop

Обратите внимание: браузеры Internet Explorer 9+, Chrome, Firefox, Opera, и Safari имеют поддержку drag and drop.

Технология drag and drop (иногда может упоминаться как drag'n'drop) позволяет сделать элементы на Ваших веб-страницах перетаскиваемыми (совсем как окна с программами в операционной системе).

Ранее это было возможным только с помощью реализаций сложных JavaScript функций или подключением jQuery. Сейчас технология drag and drop является частью спецификации HTML5 и ее поддержка встроена во все современные веб-браузеры.

Как сделать элемент перетаскиваемым

Практически любые элементы на веб-страницах можно сделать перетаскиваемыми включая картинки, ссылки и обычные текстовые элементы. Для того, чтобы сделать элемент перетаскиваемым необходимо добавить к нему HTML5 атрибут draggable со значением true.

Пример

<img draggable='true'>

Мало просто сделать элемент перетаскиваемым (Вы можете в этом убедится запустив предыдущий пример), чтобы извлечь из этого какую-либо пользу мы должны дополнительно обработать перетаскиваемый элемент с помощью специальных событий перетаскивания, которые были добавлены в HTML5:

Событие Описание
dragstart Выполнится в начале операции перетаскивания
ondrag Выполнится во время перетаскивания элемента
ondragenter Выполнится когда перетаскиваемый элемент будет наведен на элемент, который может его принять
ondragleave Выполнится когда перетаскиваемый элемент будет выведен за пределы границ элемента, который может его принять
ondragover Выполнится когда перетаскиваемый элемент будет перемещаться в пределах границ элемента, который может его принять
ondrop Выполнится когда перетаскиваемый элемент будет перемещен в принимающий его элемент
ondropend Выполнится в конце операции перетаскивания

Обработка элемента во время перетаскивания

Всю обработку перетаскивания элемента можно условно разбить на два шага:

1. Сохранение данных перетаскиваемого элемента в начале операции перетаскивания.

2. Извлечение ранее сохраненных данных, после того, как перетаскиваемый элемент будет перемещен в принимающий его элемент.

Для того, чтобы сохранить данные мы должны воспользоваться методом setData("тип_данных","сохраняемые_данные") HTML5 объекта DataTransfer. Данные перетаскиваемого элемента необходимо сохранять в самом начале перетаскивания, то есть во время события ondragstart.

Пример

<script>
function dragImg(e) {
alert(e.target.id);
e.dataTransfer.setData("text/plain",e.target.id);
}
function dragEl(e) {
alert(e.target.innerHTML);
e.dataTransfer.setData("text/html",e.target.innerHTML);
}
</script>
<img src="gimg3.gif" draggable="true" ondragstart="dragImg(event)" id="draggable-element">
<div id="dragel" draggable="true" ondragstart="dragEl(event)">Меня можно перетаскивать!</div>

Для того, чтобы извлечь ранее сохраненные данные мы должны воспользоваться методом getData("тип_данных") объекта DataTransfer. Данные перетаскиваемого элемента необходимо извлекать после того, как перетаскиваемый элемент будет перемещен в область принимающего его элемента, то есть во время события ondrop.

Обратите внимание: тип данных во время сохранения и извлечения должен совпадать, то есть если Вы сохраняли данные с типом "text/plain" Вы должны использовать "text/plain" и для их извлечения.

По умолчанию элементы не могут принимать другие элементы, поэтому если мы хотим создать принимающий элемент мы должны привязать к нему обработчик события ondragover и передать ему event.preventDefault().

Пример

<script>
function makeDroppable(e) {
e.preventDefault();
}
function dragImg(e) { 
e.dataTransfer.setData("text/plain",e.target.id);
}
function dropImg(e) {
var rdata = e.dataTransfer.getData("text/plain");
e.target.innerHTML="";
e.target.appendChild(document.getElementById(rdata))
}
</script>
<img src="gimg3.gif" draggable="true" ondragstart="dragImg(event)" id="draggable-element">
<div id="dropel" ondrop="dropImg(event)" ondragover="makeDroppable(event)">Перетащите элемент сюда!</div>