diff --git a/Sortable.js b/Sortable.js index 6f5c9c9..caa55e1 100644 --- a/Sortable.js +++ b/Sortable.js @@ -763,7 +763,7 @@ if (rootEl !== parentEl) { newIndex = _index(dragEl); - if (newIndex != -1) { + if (newIndex >= 0) { // drag from one list and drop into another _dispatchEvent(null, parentEl, 'sort', dragEl, rootEl, oldIndex, newIndex); _dispatchEvent(this, rootEl, 'sort', dragEl, rootEl, oldIndex, newIndex); @@ -782,7 +782,8 @@ if (dragEl.nextSibling !== nextEl) { // Get the index of the dragged element within its parent newIndex = _index(dragEl); - if (newIndex != -1) { + + if (newIndex >= 0) { // drag & drop within the same list _dispatchEvent(this, rootEl, 'update', dragEl, rootEl, oldIndex, newIndex); _dispatchEvent(this, rootEl, 'sort', dragEl, rootEl, oldIndex, newIndex); @@ -791,7 +792,10 @@ } if (Sortable.active) { - // Drag end event + if (newIndex == null || newIndex === -1) { + newIndex = oldIndex; + } + _dispatchEvent(this, rootEl, 'end', dragEl, rootEl, oldIndex, newIndex); // Save sorting @@ -1154,20 +1158,22 @@ /** * Returns the index of an element within its parent - * @param el - * @returns {number} - * @private + * @param {HTMLElement} el + * @return {number} */ - function _index(/**HTMLElement*/el) { + function _index(el) { + var index = 0; + if (!el || !el.parentNode) { return -1; } - var index = 0; + while (el && (el = el.previousElementSibling)) { if (el.nodeName.toUpperCase() !== 'TEMPLATE') { index++; } } + return index; }