почему бы не использовать цель события mouseup, а не позицию для "старой школы" drag-n-drop? - PullRequest
7 голосов
/ 18 июля 2011

Итак, из того, что я видел, почти все IE-совместимые drag-n-drop используют позиционирование, чтобы определить, где что-то пропущено. Делая что-то вроде mousedown, определите положение всех сбрасываемых предметов, mouseup определите, находимся ли мы в положении сбрасывания. Зачем? Я сделал быстрый прототип, и он, кажется, работает, который использует event.target при mouseup (в jquery, так что бы он ни переводил в другое место), чтобы определить элемент drop.

Есть ли веская причина не делать этого? (используйте e.target при mouseup). Таким образом, mousedown определяет то, что перетаскивается, а mouseup определяет, куда оно перетаскивается. Добавьте переменную, чтобы убедиться, что мы перетаскиваем, и запомните, что перетаскивают.

Ответы [ 2 ]

3 голосов
/ 04 августа 2011

Мое предположение: потому что e.target при наведении мыши может ссылаться на элемент, который вы перетаскиваете (или его призрак-перетаскивание). Если вы перетаскиваете элемент, и он (или полупрозрачный элемент-призрак) следует за вашим курсором, как при перетаскивании файла на рабочем столе, ваша мышь будет всегда находиться над элементом, который вы перетаскиваете, при наведении мыши -до.


В качестве альтернативы, если нет следования за курсором и появления двоений, e.target может ссылаться на элемент внутри "элемента dropzone", а не на саму droppoint.

Например:

<div id="dropzone_element">
    <div id="previously_dropped_element" />
<div>

<div id="draggable_element" />

Таким образом, если вы перетаскиваете перетаскиваемый элемент поверх элемента dropzone и отпускаете мышь, вы фактически отпускаете мышь над ранее отпущенным элементом внутри dropzone; не сама дропзона.

В обоих случаях проверка положения мыши - единственный способ получить правильный элемент dropzone.

Это были бы мои догадки, но у меня нет IE, чтобы проверить реальное поведение.


Редактировать: В 1-м случае проверка положения является единственным способом. Во втором случае вы также можете проверить предков цели, чтобы найти элемент dropzone, как указано в комментариях aephus. Если, то есть, ранее удаленный элемент фактически был вставлен в иерархию Dropzone, а не просто размещен так, как это выглядит - хотя это было бы действительно странно:)

1 голос
/ 04 августа 2011

Первое задание: при перетаскивании элементов всегда есть задержки, особенно в IE.И указатель мыши может опережать или отставать от элемента перетаскивания.Таким образом, при перетаскивании указатель на самом деле не находится над перетаскиваемым элементом и - для небольших зон перетаскивания - не над зоной перетаскивания.Библиотеки Ajax должны учитывать этот факт.И единственный способ заставить его работать предсказуемо - это сравнить координаты перетаскиваемой цели и зоны перетаскивания.

Второй вопрос: библиотеки ajax могут дать вам возможность использовать drop handler.drop handler - это элемент, который не является дочерним для зоны сброса, но он покрывает зону сброса.И в этом случае нет способа отлавливать события по дропзоне.Но сравнение координат все еще работает.Зачем кому-то охватывать дропзону?Давайте предположим, что у кого-то есть таблица.И одна из клеток - это дропзона.А теперь хочется поймать событие колесика мыши.Один создает div (#scroller) того же размера, что и таблица, и размещает его над таблицей.Затем он помещает еще один div (#eventgrabber) в скроллер.Eventgrabber выше, чем скроллер.Теперь можно перехватить событие прокрутки на скроллере.Но чтобы можно было перетаскивать ячейки, нужно назначить обработчик событий как обработчик перетаскивания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...