| 1 | 1 <!doctype html> | 
|  | 2 <html> | 
|  | 3 	<head> | 
|  | 4 		<meta name="viewport" content="width=device-width, initial-scale=1"> | 
|  | 5 		<style> | 
|  | 6 			@import "/site.css"; | 
|  | 7 | 
|  | 8 			div[drag] { | 
|  | 9 				border: 1px solid; | 
|  | 10 				margin: 8px; | 
|  | 11 				padding: 8px; | 
|  | 12 				touch-action: none; | 
|  | 13 				background-color: LightGreen; | 
|  | 14 			} | 
|  | 15 		</style> | 
|  | 16 		<script src="https://cdn.jsdelivr.net/npm/interactjs/dist/interact.js"></script> | 
|  | 17 		<script> | 
|  | 18 			'use strict'; | 
|  | 19 | 
|  | 20 			let dxDrag, dyDrag; | 
|  | 21 | 
|  | 22 			function dragStartListener(event) { | 
|  | 23 				dxDrag = 0; | 
|  | 24 				dyDrag = 0; | 
|  | 25 			} | 
|  | 26 | 
|  | 27 			function dragMoveListener(event) { | 
|  | 28 				dxDrag += event.dx; | 
|  | 29 				dyDrag += event.dy; | 
|  | 30 				event.target.style.transform = `translate(${dxDrag}px, ${dyDrag}px)`; | 
|  | 31 			} | 
|  | 32 | 
|  | 33 			function dragEndListener(event) { | 
|  | 34 				event.target.style.transform = null; | 
|  | 35 			} | 
|  | 36 | 
|  | 37 			function indexOf(a,el) { | 
|  | 38 				for( let i=0; i<a.length; i++ ) { | 
|  | 39 					if( a[i] === el ) | 
|  | 40 						return i; | 
|  | 41 				} | 
|  | 42 				return -1; | 
|  | 43 			} | 
|  | 44 | 
|  | 45 			function dragEnterListener(event) { | 
|  | 46 				console.log(event); | 
|  | 47 				let entered = event.target; | 
|  | 48 				let dragging = event.relatedTarget; | 
|  | 49 				if( entered === dragging ) | 
|  | 50 					return; | 
|  | 51 				let divs = document.querySelectorAll('div[drag]'); | 
|  | 52 				let iEntered = indexOf(divs,entered); | 
|  | 53 				let iDragging = indexOf(divs,dragging); | 
|  | 54 				console.log(iDragging+' '+iEntered); | 
|  | 55 				let parent = entered.parentNode; | 
|  | 56 				if( iDragging < iEntered ) { | 
|  | 57 					let next = divs[iEntered+1]; | 
|  | 58 					if( next ) { | 
|  | 59 						parent.insertBefore( dragging, next ); | 
|  | 60 					} else { | 
|  | 61 						parent.appendChild( dragging ); | 
|  | 62 					} | 
|  | 63 				} else { | 
|  | 64 					parent.insertBefore( dragging, entered ); | 
|  | 65 				} | 
|  | 66 			} | 
|  | 67 | 
|  | 68 			function init() { | 
|  | 69 				let dad = interact('div[drag]'); | 
|  | 70 				dad.draggable({ | 
|  | 71 					listeners: { | 
|  | 72 						start: dragStartListener, | 
|  | 73 						move: dragMoveListener, | 
|  | 74 						end: dragEndListener, | 
|  | 75 					} | 
|  | 76 				}); | 
|  | 77 				dad.dropzone({ | 
|  | 78 					ondragenter: dragEnterListener, | 
|  | 79 				}); | 
|  | 80 			} | 
|  | 81 		</script> | 
|  | 82 	</head> | 
|  | 83 	<body> | 
|  | 84 		<h1><a href="https://interactjs.io/">interact.js</a></h1> | 
|  | 85 | 
|  | 86 		<p>This has a number of problems.  First, it is clearly too complicated.  And this means that it isn't on just one JavaScript file.  One has to use the modern horror of <b>npm</b> to get it (which I refuse to do).  The suggested way of handling dragging doesn't work when the DOM changes, as the example below shows.  There is probably some complicated way around this, but I can't be bothered given the other issues.</p> | 
|  | 87 | 
|  | 88 		<div> | 
|  | 89 		<script> | 
|  | 90 			for( let i=1; i<=10; i++ ) { | 
|  | 91 				document.write(` | 
|  | 92 			<div drag id="${i}">${i} - drag me</div> | 
|  | 93 `				); | 
|  | 94 			} | 
|  | 95 		</script> | 
|  | 96 		</div> | 
|  | 97 	</body> | 
|  | 98 	<script> init(); </script> | 
|  | 99 </html> |