When I was writing (learning jQuery) Solitaire game, I faced lack of documentation on drag-n-drop event’s order. So I made simple JavaScript code to investigate this:
$(function() { $( "#draggable" ).draggable({ create: function( event, ui ) {console.log('DRG create');}, drag: function( event, ui ) {console.log('DRG drag');}, start: function( event, ui ) {console.log('DRG start');}, stop: function( event, ui ) {console.log('DRG stop');}, revert: function( event, ui ) {console.log('DRG revert'); return true;}, }); $( "#droppable" ).droppable({ drop: function( event, ui ) {console.log('DRP drop');}, over: function( event, ui ) {console.log('DRP over');}, out: function( event, ui ) {console.log('DRP out');}, deactivate: function( event, ui ) {console.log('DRP deactivate');}, activate: function( event, ui ) {console.log('DRP activate');}, create: function( event, ui ) {console.log('DRP create');} }); $('#draggable').on('mousedown', function(){ console.log('DRG M mousedown'); }); $('#draggable').on('mouseup', function(){ console.log('DRG M mouseup'); }); $('#draggable').on('mouseenter', function(){ console.log('DRG M mouseenter'); }); $('#draggable').on('hover', function(){ console.log('DRG M hover'); }); $('#draggable').on('mouseleave', function(){ console.log('DRG M mouseleave'); }); $('#draggable').on('mouseout', function(){ console.log('DRG M mouseout'); }); $('#draggable').on('mouseclick', function(){ console.log('DRG M mouseclick'); }); $('#droppable').on('mousedown', function(){ console.log('DRP M mousedown'); }); $('#droppable').on('mouseup', function(){ console.log('DRP M mouseup'); }); $('#droppable').on('mouseenter', function(){ console.log('DRP M mouseenter'); }); $('#droppable').on('hover', function(){ console.log('DRP M hover'); }); $('#droppable').on('mouseleave', function(){ console.log('DRP M mouseleave'); }); $('#droppable').on('mouseout', function(){ console.log('DRP M mouseout'); }); $('#droppable').on('mouseclick', function(){ console.log('DRP M mouseclick'); }); });
Working demo on JSFiddle – https://jsfiddle.net/y5ykm415/4/
So, quick summary of events order:
- Draggable element on mouse click (mousedown) executes drag start event and actual dragging begins
- All droppable elements activate an wait for droppables.
- Draggable’s drag event executes again and again on each, smallest mouse movement.
- When draggable reaches droppable and meets tolerance and accept conditions, it(draggable) can be dropped on droppable.
- After mouse button is realeased (mouseup event) and if draggable successfully dropped on droppable drop event fires.
- Then all droppables will deactivate.
- If draggable was not dropped on droppable – it can stay or return back to place depending on revert option.
- Draggable stops.
*Until mouse doesn’t move (after drop) mouseleave, mouseout & mousenter events won’t fire (even if elements will move from/to mouse).
Here I drawed a diagram of events over time of one drag’n’drop:
*All above was tested on Google’s Chrome. Can be some minor variations on others.