diff --git a/Sortable.js b/Sortable.js index f4ac38d..f8ceed0 100644 --- a/Sortable.js +++ b/Sortable.js @@ -271,7 +271,7 @@ } // get the index of the dragged element within its parent - oldIndex = _index(target); + oldIndex = _index(target, options.draggable); // Check filter if (typeof filter === 'function') { @@ -766,7 +766,7 @@ _toggleClass(dragEl, this.options.chosenClass, false); if (rootEl !== parentEl) { - newIndex = _index(dragEl); + newIndex = _index(dragEl, options.draggable); if (newIndex >= 0) { // drag from one list and drop into another @@ -786,7 +786,7 @@ if (dragEl.nextSibling !== nextEl) { // Get the index of the dragged element within its parent - newIndex = _index(dragEl); + newIndex = _index(dragEl, options.draggable); if (newIndex >= 0) { // drag & drop within the same list @@ -979,17 +979,11 @@ function _closest(/**HTMLElement*/el, /**String*/selector, /**HTMLElement*/ctx) { if (el) { ctx = ctx || document; - selector = selector.split('.'); - - var tag = selector.shift().toUpperCase(), - re = new RegExp('\\s(' + selector.join('|') + ')(?=\\s)', 'g'); do { if ( - (tag === '>*' && el.parentNode === ctx) || ( - (tag === '' || el.nodeName.toUpperCase() == tag) && - (!selector.length || ((' ' + el.className + ' ').match(re) || []).length == selector.length) - ) + (selector === '>*' && el.parentNode === ctx) + || _matches(el, selector) ) { return el; } @@ -1162,11 +1156,13 @@ } /** - * Returns the index of an element within its parent + * Returns the index of an element within its parent for a selected set of + * elements * @param {HTMLElement} el + * @param {selector} selector * @return {number} */ - function _index(el) { + function _index(el, selector) { var index = 0; if (!el || !el.parentNode) { @@ -1174,7 +1170,8 @@ } while (el && (el = el.previousElementSibling)) { - if (el.nodeName.toUpperCase() !== 'TEMPLATE') { + if (el.nodeName.toUpperCase() !== 'TEMPLATE' + && _matches(el, selector)) { index++; } } @@ -1182,6 +1179,22 @@ return index; } + function _matches(/**HTMLElement*/el, /**String*/selector) { + if (el) { + selector = selector.split('.'); + + var tag = selector.shift().toUpperCase(), + re = new RegExp('\\s(' + selector.join('|') + ')(?=\\s)', 'g'); + + return ( + (tag === '' || el.nodeName.toUpperCase() == tag) && + (!selector.length || ((' ' + el.className + ' ').match(re) || []).length == selector.length) + ); + } + + return false; + } + function _throttle(callback, ms) { var args, _this;