Skip to content

Commit 8e23ad9

Browse files
committed
Use modern moveBefore when available
1 parent 92dd48c commit 8e23ad9

File tree

5 files changed

+36
-18
lines changed

5 files changed

+36
-18
lines changed

plugins/MultiDrag/MultiDrag.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ import {
1010
setRect,
1111
unsetRect,
1212
matrix,
13-
expando
13+
expando,
14+
insertOrMoveBefore
1415
} from '../../src/utils.js';
1516

1617
import dispatchEvent from '../../src/EventDispatcher.js';
@@ -421,7 +422,7 @@ function MultiDragPlugin() {
421422

422423
multiDragElements.forEach(multiDragElement => {
423424
if (children[multiDragIndex]) {
424-
parentEl.insertBefore(multiDragElement, children[multiDragIndex]);
425+
insertOrMoveBefore(parentEl, multiDragElement, children[multiDragIndex]);
425426
} else {
426427
parentEl.appendChild(multiDragElement);
427428
}
@@ -600,7 +601,7 @@ function insertMultiDragElements(clonesInserted, rootEl) {
600601
multiDragElements.forEach((multiDragElement, i) => {
601602
let target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];
602603
if (target) {
603-
rootEl.insertBefore(multiDragElement, target);
604+
insertOrMoveBefore(rootEl, multiDragElement, target);
604605
} else {
605606
rootEl.appendChild(multiDragElement);
606607
}
@@ -616,7 +617,7 @@ function insertMultiDragClones(elementsInserted, rootEl) {
616617
multiDragClones.forEach((clone, i) => {
617618
let target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];
618619
if (target) {
619-
rootEl.insertBefore(clone, target);
620+
insertOrMoveBefore(rootEl, clone, target);
620621
} else {
621622
rootEl.appendChild(clone);
622623
}

plugins/OnSpill/OnSpill.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
import { getChild } from '../../src/utils.js';
1+
import {
2+
getChild,
3+
insertOrMoveBefore
4+
} from '../../src/utils.js';
25

36

47
const drop = function({
@@ -37,7 +40,7 @@ Revert.prototype = {
3740
let nextSibling = getChild(this.sortable.el, this.startIndex, this.options);
3841

3942
if (nextSibling) {
40-
this.sortable.el.insertBefore(dragEl, nextSibling);
43+
insertOrMoveBefore(this.sortable.el, dragEl, nextSibling);
4144
} else {
4245
this.sortable.el.appendChild(dragEl);
4346
}

plugins/Swap/Swap.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {
22
toggleClass,
3-
index
3+
index,
4+
insertOrMoveBefore
45
} from '../../src/utils.js';
56

67
let lastSwapEl;
@@ -83,8 +84,8 @@ function swapNodes(n1, n2) {
8384
if (p1.isEqualNode(p2) && i1 < i2) {
8485
i2++;
8586
}
86-
p1.insertBefore(n2, p1.children[i1]);
87-
p2.insertBefore(n1, p2.children[i2]);
87+
insertOrMoveBefore(p1, n2, p1.children[i1]);
88+
insertOrMoveBefore(p2, n1, p2.children[i2]);
8889
}
8990

9091
export default SwapPlugin;

src/Sortable.js

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ import {
3636
clone,
3737
expando,
3838
getChildContainingRectFromElement,
39-
getParentOrHost
39+
getParentOrHost,
40+
insertOrMoveBefore
4041
} from './utils.js';
4142

4243

@@ -957,7 +958,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
957958
if (Sortable.eventCanceled) return;
958959

959960
if (!_this.options.removeCloneOnHide) {
960-
rootEl.insertBefore(cloneEl, dragEl);
961+
insertOrMoveBefore(rootEl, cloneEl, dragEl);
961962
}
962963
_this._hideClone();
963964

@@ -1176,7 +1177,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
11761177

11771178
if (!Sortable.eventCanceled) {
11781179
if (nextEl) {
1179-
rootEl.insertBefore(dragEl, nextEl);
1180+
insertOrMoveBefore(rootEl, dragEl, nextEl);
11801181
} else {
11811182
rootEl.appendChild(dragEl);
11821183
}
@@ -1207,7 +1208,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
12071208
if (onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {
12081209
capture();
12091210
if (elLastChild && elLastChild.nextSibling) { // the last draggable element is not the last node
1210-
el.insertBefore(dragEl, elLastChild.nextSibling);
1211+
insertOrMoveBefore(el, dragEl, elLastChild.nextSibling);
12111212
}
12121213
else {
12131214
el.appendChild(dragEl);
@@ -1229,7 +1230,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
12291230

12301231
if (onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) {
12311232
capture();
1232-
el.insertBefore(dragEl, firstChild);
1233+
insertOrMoveBefore(el, dragEl, firstChild);
12331234
parentEl = el; // actualization
12341235

12351236
changed();
@@ -1304,7 +1305,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
13041305
if (after && !nextSibling) {
13051306
el.appendChild(dragEl);
13061307
} else {
1307-
target.parentNode.insertBefore(dragEl, after ? nextSibling : target);
1308+
insertOrMoveBefore(target.parentNode, dragEl, after ? nextSibling : target);
13081309
}
13091310

13101311
// Undo chrome's scroll adjustment (has no effect on other browsers)
@@ -1742,9 +1743,9 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
17421743

17431744
// show clone at dragEl or original position
17441745
if (dragEl.parentNode == rootEl && !this.options.group.revertClone) {
1745-
rootEl.insertBefore(cloneEl, dragEl);
1746+
insertOrMoveBefore(rootEl, cloneEl, dragEl);
17461747
} else if (nextEl) {
1747-
rootEl.insertBefore(cloneEl, nextEl);
1748+
insertOrMoveBefore(rootEl, cloneEl, nextEl);
17481749
} else {
17491750
rootEl.appendChild(cloneEl);
17501751
}

src/utils.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,17 @@ function getChildContainingRectFromElement(container, options, ghostEl) {
561561

562562
const expando = 'Sortable' + (new Date).getTime();
563563

564+
function insertOrMoveBefore(rootNode, movedNode, referenceNode) {
565+
if (rootNode['moveBefore']) {
566+
try {
567+
rootNode.moveBefore(movedNode, referenceNode)
568+
} catch (e) { // Could throw a HierarchyRequestError in some cases https://developer.mozilla.org/en-US/docs/Web/API/Element/moveBefore#movebefore_constraints
569+
rootNode.insertBefore(movedNode, referenceNode)
570+
}
571+
} else {
572+
rootNode.insertBefore(movedNode, referenceNode)
573+
}
574+
}
564575

565576
export {
566577
on,
@@ -591,5 +602,6 @@ export {
591602
unsetRect,
592603
getContentRect,
593604
getChildContainingRectFromElement,
594-
expando
605+
expando,
606+
insertOrMoveBefore
595607
};

0 commit comments

Comments
 (0)