получить падение после Dragleave в HTML5 - PullRequest
2 голосов
/ 21 января 2011

Я зарегистрирован на события HTML5 DnD, чтобы получать файлы с рабочего стола.Проблема, которую я вижу, состоит в том, что я всегда получаю событие dragleave непосредственно перед событием drop.В спецификации нет упоминания о чем-то подобном - и если вы используете перетаскивание как индикатор того, что никакого падения не произошло, то это испортит логику.

var dropbox = document.getElementById("dropzone");
dropbox.addEventListener("dragenter", dragEnter, false);
dropbox.addEventListener("dragleave", dragLeave, false);
dropbox.addEventListener("dragover", dragOver, false);
dropbox.addEventListener("drop", drop, false);

function dragEnter(e){
    console.log("dragEnter ",e);
    dropbox.style.backgroundColor = "red";
    e.stopPropagation();
    e.preventDefault();
}

function dragLeave(e){
    console.log("dragleave");
    dropbox.style.backgroundColor = "white";
    e.stopPropagation();
    e.preventDefault();
}

function dragOver(e){
    console.log("dragOver ",e);
    e.stopPropagation();
    e.preventDefault();
}

function drop(e){
     console.log("drop ",e);
     var files = e.dataTransfer.files;
     var count = files.length;
     e.stopPropagation();
     e.preventDefault();
}

это работает как дизайн или я что-то упустил?

Ответы [ 2 ]

1 голос
/ 07 марта 2011

Событие Dragleave на самом деле не делает то, что подразумевает. Это не так, пока вы не переместите перетаскиваемый объект над зоной падения, а затем переместите его, не сбрасывая огонь драконьей волны. Он не был реализован для обнаружения ранее удаленного элемента, перетаскиваемого из рабочей зоны. Это просто часть цепочки событий, попадающая где-то между драгстартом и драгендом. Из спецификации это происходит, если «операция перетаскивания не удалась». (Очевидно, у Firefox есть известная проблема в том, что событие dragleave вызывается, даже если удаление прошло успешно).

http://www.w3.org/html/wg/drafts/html/master/editing.html#drag-and-drop-processing-model

Так что вы оба частично правы. «Это показатель того, что перетаскиваемый объект был вытянут из другого объекта». верно, пока этот перетаскиваемый объект ранее не был отброшен. Кроме того, для определения отсутствия сброса допустимо использование события dragleave.

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

РЕДАКТИРОВАТЬ: философские рассуждения ... Если вы можете предположить, что не все Zinks являются Zorks, то вы можете предположить, что не все приложения, которые реализуют функцию перетаскивания, захотят позволить пользователю, который что-то уронил, удалить этот удаленный элемент. потом. Следовательно, использование перетаскивания в определенных сценариях может привести к перегрузке памяти браузером для поддержания состояния, элементы которого ранее были отброшены в любое время. (Изобразите мозаику, в которой нет понятия «состояние»).

1 голос
/ 22 января 2011

Это похоже на хороший справочник: http://www.useragentman.com/blog/2010/01/10/cross-browser-html5-drag-and-drop/

По сути, dragLeave не является показателем того, что никакого падения не произошло.Это показатель того, что перетаскиваемый объект был перетащен из другого объекта.
Он вам не нужен.

[Редактировать: В основном, dragleave запускается, потому что объект, из которого вы перетаскиваетеваш рабочий стол.object, который находится перед тем, как вы его уроните, это в основном ваш рабочий стол.Если вы перетащите какой-либо файл со своего рабочего стола поверх какой-либо цели-сбрасывателя, он запустит dragleave, чтобы указать, что он больше не «в» предыдущем объекте (вашем рабочем столе), а теперь находится в новом объекте («дропзоне»).Если у вас было несколько дропзон, каждый раз, когда вы перетаскивали их, то из одной из них срабатывал dragleave.Вам просто нужно использовать событие drop, чтобы узнать, произошло ли падение.]

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