$('...').sortable('refresh')
method, which is very inconvenient. function sortable(rootEl, onUpdate){ var dragEl; // [].slice.call(rootEl.children).forEach(function (itemEl){ itemEl.draggable = true; }); // function _onDragOver(evt){ evt.preventDefault(); evt.dataTransfer.dropEffect = 'move'; var target = evt.target; if( target && target !== dragEl && target.nodeName == 'LI' ){ // rootEl.insertBefore(dragEl, target.nextSibling || target); } } // function _onDragEnd(evt){ evt.preventDefault(); dragEl.classList.remove('ghost'); rootEl.removeEventListener('dragover', _onDragOver, false); rootEl.removeEventListener('dragend', _onDragEnd, false); // onUpdate(dragEl); } // rootEl.addEventListener('dragstart', function (evt){ dragEl = evt.target; // // evt.dataTransfer.effectAllowed = 'move'; evt.dataTransfer.setData('Text', dragEl.textContent); // dnd rootEl.addEventListener('dragover', _onDragOver, false); rootEl.addEventListener('dragend', _onDragEnd, false); setTimeout(function (){ // setTimeout, // , . dragEl.classList.add('ghost'); }, 0) }, false); } // sortable( document.getElementById('list'), function (item){ console.log(item); });
rootEl.insertBefore(dragEl, target.nextSibling || target)
, where target
is the element rootEl.insertBefore(dragEl, target.nextSibling || target)
at. If you have already tested an example, you probably noticed that you cannot drag an element to the first position. Another nuance of the method is that onUpdate
is called every time, even if the element has not been moved.target.nextSibling
only if it is not the first item in the list: if( target && target !== dragEl && target.nodeName == 'LI' ){ // rootEl.insertBefore(dragEl, rootEl.children[0] !== target && target.nextSibling || target); }
nextEl = dragEl.nextSibling
) at the moment of dragstart
allows you to get rid of the second problem (http://jsfiddle.net/RubaXa/zLq5J/4/29 and 38 line).attachEvent
and remove dragEl.classList.add/remove
, then the code will work even in IE5.5:] var rect = target.getBoundingClientRect(); var next = (evt.clientY - rect.top)/(rect.bottom - rect.top) > .5; rootEl.insertBefore(dragEl, next && target.nextSibling || target);
touchstart
I clone an element that will act as a “ghost” under the finger and on the touchmove
move it using translate3d
: var touch = evt.touches[0] , dx = touch.clientX - tapEvt.clientX , dy = touch.clientY - tapEvt.clientY ;
setInterval
, in which every 100ms I check the element over which there is currently a finger: _emulateDragOver: function (){ if( touchEvt ){ // “” _css(ghostEl, 'display', 'none'); // , var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY); // rootEl, // onDragOver: this._onDragOver({ target: target , clientX: touchEvt.clientX , clientY: touchEvt.clientY }); // “” _css(ghostEl, 'display', ''); } }
// , ul > li var list = document.getElementById("my-ui-list"); new Sortable(list); // . // var foo = document.getElementById("foo"); new Sortable(foo, { group: "omega" }); var bar = document.getElementById("bar"); new Sortable(bar, { group: "omega" }); // handle + event var container = document.getElementById("multi"); new Sortable(container, { handle: ".tile__title", // css-, dragabble: ".tile", // css- , onUpdate: function (evt/**Event*/){ var item = evt.detail; // , } });
Source: https://habr.com/ru/post/207048/
All Articles