Javascript: handleDragLeave和handleDragEnd没有移除拖放元素时的类效果
Javascript: handleDragLeave and handleDragEnd not removing class effect on drag over element
我在https://jsfiddle.net/64y1280t/上有一个拖放排序表行示例。如果你拖拽一个项目,例如,从"F"拖拽到"A",那么你仍然会看到"A"上的黄色背景效果。然而,我已经有了handleDragLeave和handleDragEnd处理程序来删除这些效果。
HTML<table id="columns">
<tr id="a" class="column a" draggable="true">
<td>A</td>
</tr>
<tr id="b" class="column b" draggable="true">
<td>B</td>
</tr>
<tr id="c" class="column c" draggable="true">
<td>C</td>
</tr>
<tr id="d" class="column d" draggable="true">
<td>D</td>
</tr>
<tr id="e" class="column e" draggable="true">
<td>E</td>
</tr>
<tr id="f" class="column f" draggable="true">
<td>F</td>
</tr>
</table>
CSS table{
width: 100%;
}
tr{
padding: 10px;
background-color: #eee;
width: 100%;
}
.column {
cursor: move;
}
.column.over {
background-color: yellow;
}
.sort_error{
background-color: red;
}
JavaScript var dragSrcEl = null;
var cols = [];
function handleDragStart(e) {
dragSrcEl = this;
e.dataTransfer.effectAllowed = 'move';
e.dataTransfer.setData('text/html', this.outerHTML);
}
function handleDragEnd(e) {
[].forEach.call(cols, function (col) {
col.classList.remove('over');
});
}
function handleDragEnter(e) {
this.classList.add('over');
}
function handleDragLeave(e) {
this.classList.remove('over');
}
function handleDragOver(e) {
if (e.preventDefault) {
e.preventDefault();
}
e.dataTransfer.dropEffect = 'move';
return false;
}
function handleDrop(e) {
if (e.stopPropagation) {
e.stopPropagation();
}
dragSrcEl.outerHTML = this.outerHTML;
this.outerHTML = e.dataTransfer.getData('text/html');
return false;
}
cols = document.querySelectorAll('#columns .column');
[].forEach.call(cols, function(col) {
col.addEventListener('dragstart', handleDragStart, false);
col.addEventListener('dragenter', handleDragEnter, false)
col.addEventListener('dragover', handleDragOver, false);
col.addEventListener('dragleave', handleDragLeave, false);
col.addEventListener('drop', handleDrop, false);
col.addEventListener('dragend', handleDragEnd, false);
});
这将解决问题。
function handleDrop(e) {
if (e.stopPropagation) {
e.stopPropagation();
}
var dragSrcElHtml = dragSrcEl.outerHTML;
this.classList.remove("over");
dragSrcEl.outerHTML = this.outerHTML;
this.outerHTML = dragSrcElHtml;
return false;
}
相关文章:
- Jquery 拖放允许 2 个元素
- JavaScript拖放 - 防止元素拖放到另一个可拖放的元素中
- 区分不同的可拖放元素(jQuery 拖放)
- JavaScript/jQuery在两个iframe之间拖放元素
- 在单独的容器中拖放,并调整放置的元素的位置
- 拖放与拖动不同的元素
- 拖放具有触摸支持的元素
- 防止在使用JS拖放时将其放入子元素内
- EaselJS / canvas在拖放过程中更改元素焦点
- 是否可以使用 JavaScript 在 WebBrowser 中拖动 WPF 元素和句柄拖放
- 防止HTML5拖放功能多次放置同一元素
- 花式树拖放 - 获取当前元素
- 由javascript创建的HTML5拖放元素:
- 拖放 - 元素不会拖放
- 是否有最适合“拖放”Web应用程序的元素
- 在 JQuery UI 拖放后查找列表中元素的索引
- 使拖放的元素可放置,同时仍可拖动
- 使用HTML5拖放,有没有办法在保持拖动流的同时隐藏元素
- 如何使用HTML2canvas截取拖放元素的屏幕截图
- 从子元素拖放父元素