JavaScript. Подробное руководство, 6-е издание, стр. 265
<b> // Сделать часы доступными для буксировки.</b><b> // То же самое можно сделать с помощью HTML-атрибута:</b><b> // <span draggable="true">... clock.draggable = true;</b><b> // Обработчики событий</b><b> clock.ondragstart = function(event) {</b><b> var event = event || window.event; // Для совместимости c IE</b><b> // Свойство dataTransfer является ключом к drag-and-drop API </b><b> var dt = event.dataTransfer;</b><b> // Сообщить броузеру, какие данные будут буксироваться.</b><b> // Если конструктор Date() вызывается как функция, он возвращает</b><b> // строку с полной информацией о текущем времени</b><b> dt.setData("Text", Date() + ”\n”);</b><b> // Определить ярлык, который будет служить визуальным представлением перемещаемой</b><b> // строки, в броузерах, поддерживающих эту возможность. Без этого для визуального</b><b> // представления броузер мог бы использовать изображение текста в часах,</b><b> if (dt.setDraglmage) dt.setDragImage(icon, 0, 0);</b><b> };</b><b> }):</b><b></script></b><b><style></b><b> flclock { /* Придать часам привлекательный внешний вид */</b><b> font: bold 24pt sans;</b><b> background: #ddf;</b><b> padding: 10px;</b><b> border: solid black 2px;</b><b> border-radius: 10px;</b><b>}</b><b></style></b><b><h1>Drag timestamps from the clock</h1></b><b><span id="clock"></span> <!-- Здесь отображается время --></b><b><textarea cols=60 rows=20></textarea> <!-- Сюда можно сбросить строку --></b>Приемники буксируемых данных сложнее в реализации, чем источники. Приемником может быть любой элемент документа: чтобы создать приемник, не требуется устанавливать HTML-атрибуты, как при создании источников, - достаточно просто определить соответствующие обработчики событий. (Однако с реализацией нового прикладного интерфейса буксировки, определяемого стандартом HTML5, вместо некоторых обработчиков событий, описываемых ниже, в элементе-приемнике необходимо будет установить атрибут
<b>dropzone</b><b>dataTransfer.types</b><b>dataTransfer.effectAllowed</b>Если элемент не отменит событие «dragenter», переданное ему броузером, броузер не будет считать этот элемент приемником для данной операции буксировки и не будет передавать ему дополнительные события. Но если приемник отменит событие «dragenter», броузер будет посылать ему события «dragover», пока пользователь будет буксировать объект над приемником. Интересно (снова) отметить, что приемник должен обрабатывать и отменять все эти события, чтобы сообщить, что он по-прежнему готов принять буксируемый объект. Если приемнику потребуется сообщить, что он поддерживает только операцию перемещение, копирования или создания ссылки, он должен устанавливать свойство
<b>dataTransfer.dropEffect</b>Если пользователь переместит буксируемый объект за границы приемника, который сообщал о своей готовности принять объект отменой событий, в приемнике будет возбуждено событие «dragleave». Обработчик этого события должен восстановить прежний цвет рамки или фона элемента или отменить любые другие визуальные изменения, выполненные в ответ на событие «dragenter». К сожалению, оба события, «dragenter» и «dragleave», всплывают; и если приемник имеет вложенные элементы, будет сложно отличить, говорит ли событие «dragleave» о том, что указатель мыши с буксируемым объектом вышел за границы элемента-приемника или что он вышел за границы вложенного элемента внутри приемника.
Наконец, если пользователь сбросит буксируемый объект над приемником, в приемнике будет возбуждено событие «drop». Обработчик этого события должен получить перемещаемые данные с помощью
<b>dataTransfer.getData()</b><b>dataTransfer.files</b><b>File</b><b>dataTransfer.items[],</b>Пример 17.5 демонстрирует, как превратить в приемники элементы
<b><ul></b><b><li></b><b><ul>,</b><b>class</b>