【发布时间】:2020-11-12 13:16:06
【问题描述】:
我指的是实现拖放系统的示例。我指的例子如下。
https://codepen.io/retrofuturistic/pen/tlbHE
我已经在我的项目中成功使用了给定的示例。唯一的问题是在这个例子中我不能将一个元素移动到最后一个位置。我如何修改此解决方案以能够将最后一个元素上方的任何项目移动到最后一个位置。
HTML
<ul id="columns">
<li class="column" draggable="true"><header>A</header></li>
<li class="column" draggable="true"><header>B</header></li>
<li class="column" draggable="true"><header>C</header></li>
<li class="column" draggable="true"><header>D</header></li>
<li class="column" draggable="true"><header>E</header></li>
</ul>
CSS
[draggable] {
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
user-select: none;
/* Required to make elements draggable in old WebKit */
-khtml-user-drag: element;
-webkit-user-drag: element;
}
#columns {
list-style-type: none;
}
.column {
width: 162px;
padding-bottom: 5px;
padding-top: 5px;
text-align: center;
cursor: move;
}
.column header {
height: 20px;
width: 150px;
color: black;
background-color: #ccc;
padding: 5px;
border-bottom: 1px solid #ddd;
border-radius: 10px;
border: 2px solid #666666;
}
.column.dragElem {
opacity: 0.4;
}
.column.over {
//border: 2px dashed #000;
border-top: 2px solid blue;
}
JS
var dragSrcEl = null;
function handleDragStart(e) {
// Target (this) element is the source node.
dragSrcEl = this;
e.dataTransfer.effectAllowed = 'move';
e.dataTransfer.setData('text/html', this.outerHTML);
this.classList.add('dragElem');
}
function handleDragOver(e) {
if (e.preventDefault) {
e.preventDefault(); // Necessary. Allows us to drop.
}
this.classList.add('over');
e.dataTransfer.dropEffect = 'move'; // See the section on the DataTransfer object.
return false;
}
function handleDragEnter(e) {
// this / e.target is the current hover target.
}
function handleDragLeave(e) {
this.classList.remove('over'); // this / e.target is previous target element.
}
function handleDrop(e) {
// this/e.target is current target element.
if (e.stopPropagation) {
e.stopPropagation(); // Stops some browsers from redirecting.
}
// Don't do anything if dropping the same column we're dragging.
if (dragSrcEl != this) {
// Set the source column's HTML to the HTML of the column we dropped on.
//alert(this.outerHTML);
//dragSrcEl.innerHTML = this.innerHTML;
//this.innerHTML = e.dataTransfer.getData('text/html');
this.parentNode.removeChild(dragSrcEl);
var dropHTML = e.dataTransfer.getData('text/html');
this.insertAdjacentHTML('beforebegin',dropHTML);
var dropElem = this.previousSibling;
addDnDHandlers(dropElem);
}
this.classList.remove('over');
return false;
}
function handleDragEnd(e) {
// this/e.target is the source node.
this.classList.remove('over');
/*[].forEach.call(cols, function (col) {
col.classList.remove('over');
});*/
}
function addDnDHandlers(elem) {
elem.addEventListener('dragstart', handleDragStart, false);
elem.addEventListener('dragenter', handleDragEnter, false)
elem.addEventListener('dragover', handleDragOver, false);
elem.addEventListener('dragleave', handleDragLeave, false);
elem.addEventListener('drop', handleDrop, false);
elem.addEventListener('dragend', handleDragEnd, false);
}
var cols = document.querySelectorAll('#columns .column');
[].forEach.call(cols, addDnDHandlers);
【问题讨论】:
标签: javascript html drag-and-drop