I am using html5 drag and drop functions to reorder dom elements on the screen. I apply css behavior to various drag and drop states when I do this, but the problem I am experiencing is that the hang state remains even after I pulled, dropped and washed out of the DOM element. Here is my code:
JAVASCRIPT:
function addDragListeners(){
$('.segmentListItem').each(function(index){
$(this)[0].addEventListener('dragstart',handleDragStart,false);
$(this)[0].addEventListener('drop',handleDrop,false);
$(this)[0].addEventListener('dragover',handleDragOver,false);
$(this)[0].addEventListener('dragenter',handleDragEnter,false);
$(this)[0].addEventListener('dragleave',handleDragLeave,false);
$(this)[0].addEventListener('dragend',handleDragEnd,false);
});
}
function handleDragEnter(e) {
this.classList.add('over');
}
function handleDragLeave(e) {
this.classList.remove('over');
}
function handleDragEnd(e){
$('.segmentListItem').removeClass('over');
}
function handleDragStart(e){
draggedItem = this;
e.dataTransfer.effectAllowed = 'move';
}
function handleDragOver(e) {
if (e.preventDefault) {
e.preventDefault();
}
e.dataTransfer.dropEffect = 'move';
return false;
}
function handleDrop(e){
if (e.stopPropagation) {
e.stopPropagation();
}
if (draggedItem != this) {
var draggedIndex = $('.segmentListItem').index($(draggedItem));
var targetIndex = $('.segmentListItem').index($(this));
if (draggedIndex > targetIndex){
$(draggedItem).insertBefore($(this));
} else {
$(draggedItem).insertAfter($(this));
}
}
return false;
}
CSS
a { border-radius: 10px; }
a:hover { background: #ccc; }
.segmentListItem { text-align:center; width: 50px; margin-right: 5px; font-size: 16px; display:inline-block; cursor:move; padding:10px; background: #fff; user-select: none; }
.segmentListItem.over { background: #000; color: #fff; }
source
share