Симуляция drag'n'drop (html5)
Любой элемент можно сделать перетаскиваемым добавив атрибут draggable="true" и управлять процессом перетаскивания через обработчики событий. Вопрос - можно ли как-то инициировать процесс drag'n'drop, если мы не имеем конкретного элемента и имеется собственный обработчик mousedown. То есть реально ли запустить процесс drag'n'drop не имея перетаскиваемого объекта?
Необходимо в реализовать в текстовом редакторе. В нем выделенный текст не представляет из себя отдельный dom-элемент, да и вообще, лежит под другими слоями и не ловит никаких событий. Пока писал, возникла идея запуска mousedown + mousemove событий на отдельно-выделенном элементе, но вот сомневаюсь что таким образом отработает дефолтное поведение (начало перетаскивания). |
danik.js, что мешает обернуть выделенный текст в, например, span?
|
Мешает реализация редактора. Там используется особая схема "прорисовки" строк, и каждая строка - это отдельный dom-элемент.
Кажется в спецификации явно говорится, что браузер не должен допускать симуляцию drag'n'drop. Я пришел к одной идее - покрыть текст слоем с атрибутом draggable. В обычных условиях клик по контейнеру будет перехватываться и preventDefault'иться и перетаскивания не будет происходить. А когда нужно будет перетащить текст, клик будет освобожден, и запустится перетаскивание этого слоя. А там уже по dragstart можно установить нужные данные (перетаскиваемый кусок текста) и словить событие drop Маленькое неудобство - не будет видно призрачного текста при перетаскивании. Но это и не нужно особо. Вот думаю что если попробовать отрисовать текст в canvas-е и установить через e.dataTransfer.setDragImage() , но в параметре должен быть Image а не Canvas. Можно ли из Canvas создать Image ? |
danik.js, вы какой-то редкостный извращенец. Нет, серьёзно.
Есть замечательное событие "selectionchange" на которое вешаешь обработчик. Выделенный текст оборачиваешь в спан, которому draggable ставишь в true. Бинго. |
Цитата:
Ну да, я не один такой. Вот, тогда гляньте на результат работы извращенных умов: http://ace.ajax.org/ Думаете там будет такое событие ? ) |
danik.js, с этого надо было начинать. Судя по тому, что я увидел, у них там есть какой-то свой драг'н'дроп текста (уж не знаю, чем не угодил стандартный). Советую покопаться в коде и найти, возможно, вы сможете отловить или как-то подключиться к их собственному событию.
А ещё можно ловить mousemove на document. Не уверен, что вам это поможет, но на всякий случай сообщаю о такой возможности) |
В ie9 (и вроде 8) есть возможность запуска drap'n'drop - у элементов есть функция dragDrop(). Более того, без ее ручного запуска не работает перетаскивание элементов, неперетаскиваемых по умолчанию(тоесть всех кроме ссылок, картинок, выделенного текста и т.д.)
К тому же в ie9 какие то глюки с dropEffect - я не могу его динамически менять по событию dragover (в зависимости от ctrl), причем в ie8 такого глюка нет. |
Часовой пояс GMT +3, время: 02:07. |