When dragging, the dragLeave event sometimes fires before the drop event.
This causes problems because the target gets listeners in dragEnter with dragLeave and removes listeners. If dragLeave fires before the frame, then there is no listener for the drop.
I think the reason has something to do with another opposite intuitive: dragEnter sometimes fires several times for the same purpose, even when propagating. With a few dragEnters, it would be possible to create drops, while others would spawn dragLeave. If so, maybe I could associate dragLeave with dragEnter, but I don't see any means for this coordination.
function dragEnter( e ) {
e.stopPropatation();
if( curCell == this ) return;
curCell = this;
curCell.addEventListener( 'drop', drop, true );
curCell.addEventListener( 'dragover', dragOver, true );
curCell.addEventListener( 'dragleave', dragLeave, true );
...
}
function dragLeave( e ) {
e.stopPropagation();
curCell.removeEventListener( 'drop', drop, true );
curCell.removeEventListener( 'dragover', dragOver, true );
curCell.removeEventListener( 'dragleave', dragLeave, true );
}
function drop( e ) {
dragLeave( e );
}
Here is the call list:
begin drag dragstart
drag enter: this=e9 - e.target=IMG
drag enter: this=e9 - e.target=TD
drag enter: this=e8 - e.target=TD
drag enter: this=e8 - adding listeners
drag enter: this=e8 - e.target=IMG
drag leave: this=e8
clearing listeners: this=e8
" " , :
drop: this=e8