Я широко использую drag-drop для HTML5, и он почти полностью ведет себя с одним небольшим исключением.
Я пытаюсь выделить мои dropzones, когда что-то перетаскивается через страницу. Сначала я попытался выполнить это, поместив слушателей jQuery в тело документа, например:
$("body").live('dragover',function(event){lightdz(event)});
$("body").live('dragexit dragleave drop',function(event){dimdz(event)});
с параметрами lightdz() и dimdz(), изменяющими свойство стиля фонового цвета для всех dropzones на странице, чтобы сделать их выделенными. Это не сработало. Всякий раз, когда перетаскиваемый объект вводил дочерний элемент на странице (например, контейнер div), слушатель помещал бы это как событие dragleave и уменьшал бы dropzone.
Я обошел это, применив слушателя ко всем видимым элементам на странице, а не только к телу. Иногда случалось небольшое видимое мерцание на капельках, когда оно пересекало границу между одним элементом и другим, но выглядело хорошо.
В любом случае, теперь я изменил lightdz() и dimdz(), чтобы они применили анимацию jQuery fadeTo() для всех не-dropzones. Это выглядит потрясающе, когда оно работает, и делает его очень очевидным для пользователя, что он может и не может забыть. Проблема в том, что когда он проходит между границами элементов, он применяет анимацию затухания. Это намного более очевидно, чем случайное мерцание фонового цвета, тем более, что, если объект перемещается по нескольким границам очень быстро, он будет ставить в очередь анимации и повторно закрашивать страницу.
Даже если я не беспокоюсь о анимации fadeTo() и просто изменяю непрозрачность, она намного более заметна, чем фликер фона, поскольку вся страница изменяется, а не только элементы dropzone.
Есть ли способ ссылаться на всю страницу как на один элемент для целей событий dragover и dragleave? В противном случае, есть ли способ обнаружить падение, которое происходит за пределами окна браузера? Если я пропущу событие dragleave, это выглядит нормально, но если какой-либо объект перетаскивается через окно браузера, а затем выходит за его пределы, вся страница остается затухающей.