2013-11-07 3 views
1

Я создаю календарь, используя html5 drag and drop api.Вложенные объекты Ember.View dragEnter dragLeave вызываются в неправильном порядке?

Я использую dragEnter и dragLeave для стилизации принимающего элемента и определения droppablity.

Принимающий элемент droppable имеет дочерние элементы, а dragLeave вызывается при перетаскивании дочернего элемента. Эта проблема известна и описана. here.

. Было обнаружено решение, что добавление dragLeave и событий dragEnter на детей и передача их обратно в родительское представление.

Вот код. http://jsbin.com/iHaNuPo/17

Проблема заключается в том, что `dragEnter 'на дочернем вызван до' dragLeave 'на родительском.

Это порядок событий.

#in from outside parent to over child 
1. parent-enter 
2. child-enter 
3. parent-leave 
#out from over child to outside parent 
1. parent-enter 
2. child-leave 
3. parent-leave 

Это ошибка?

Кто-нибудь знает, как избежать события dragLeave родителя при стрельбе при падении над ребенком?

Или способ исправить порядок, в котором события dragLeave, dragEnter пожар?

Должен ли я повернуть html5 с помощью перетаскивания и использовать jquery ui draggable/droppable?

EDIT

Вот рабочий пример, как в ответ Вуди.

http://jsbin.com/OjAGabUj/22

+0

Должны ли вы разорвать родной d-n-d? Вероятно, это обеспечит вашу совместимость, если вы используете библиотеку с прокладками. В противном случае, он все равно отложит на родной. –

ответ

2

Надеется, что это может помочь вам, хотя это не угасающее, может быть, вы можете использовать его. У меня был довольно большой опыт перетаскивания HTML5, и это немного неприятно, но если вы хотите, чтобы классные вещи, такие как перетаскивание поперечного окна, стоили усилий, которые я думаю.

var ignoreNextLeave = false; 

$("#outerDragTarget").on("dragenter", function(ev) { 
    // not interested in dragleaves from my children... 
    if (ev.target !== this) { 
     ignoreNextLeave = true; 
    } 

    $(this).addClass("dragover"); 

}).on("dragleave", function(ev) { 

    if (ignoreNextLeave) { 
     ignoreNextLeave = false; 
     return; 
    } 

    $(this).removeClass("dragover"); 
}); 

$("#innerDragTarget").on("dragleave", function(ev) { 
    ev.stopPropagation(); 
}); 

Вы можете запустить его here

Хитрость заключается в том, чтобы отменить распространение dragleaves из внутреннего элемента и обратите внимание, что при перетаскивании пожаров на родителе и цель не является родитель, мы о чтобы получить перетаскивание, мы не заинтересованы. Не идеальный, но он может быть учтен во что-то, что вы, надеюсь, можете использовать.

+0

Удивительно, что работает! Я добавил пример реализации вашего метода. –

+0

Прохладный! Перетаскивание HTML5 имеет несколько грубых краев и неоднородную поддержку IE. Из IE10 вещи начинают немного улучшаться, хотя есть проблемы, но большинство из них можно обойти. Я потратил немало времени на то, чтобы работать с этим материалом на моей работе в течение прошлого года, поэтому ознакомьтесь с моими другими вопросами и ответами - они более или менее содержат все полезные материалы, которые я узнал :) – Woody

+0

Итак, я бы использовал HTML5 перетаскивание, если можно, насколько я знаю, ни одна из доступных перетаскиваемых фреймворков не использует собственные перетаскивания.Родное перетаскивание - единственная игра в городе, если вы хотите перетащить перетащить окно или перетащить его в другое приложение. – Woody

Смежные вопросы