나는이 답변을 모두 읽은 후에도 이것으로 많은 어려움을 겪었고 솔루션이 조금 더 간단한 접근법 중 하나 일 수 있다고 생각했기 때문에 솔루션을 공유 할 수 있다고 생각했습니다. 내 생각은 단순히dragleave
이벤트 리스너를 완전히 새로운 dragenter 이벤트가 발생했을 때 dragleave 동작을 코딩하는 동안 dragenter 이벤트가 불필요하게 발생하지 않도록하는 것이 었습니다.
아래 예제에는 드래그 앤 드롭 API를 통해 테이블 행 내용을 서로 교환 할 수있는 테이블이 있습니다. 에 dragenter
요소를 현재 드래그하고있는 행 요소에 CSS 클래스를 추가하여 강조 표시 한 다음 dragleave
이 클래스를 제거합니다.
예:
매우 기본적인 HTML 테이블 :
<table>
<tr>
<td draggable="true" class="table-cell">Hello</td>
</tr>
<tr>
<td draggable="true" clas="table-cell">There</td>
</tr>
</table>
그리고 각 테이블 셀에 추가 DragEnter 이벤트 핸들러 함수 (옆 dragstart
, dragover
, drop
, 그리고 dragend
이 질문에 국한되지 않는 핸들러, 그래서 여기에 복사되지 않습니다)
/*##############################################################################
## Dragenter Handler ##
##############################################################################*/
// When dragging over the text node of a table cell (the text in a table cell),
// while previously being over the table cell element, the dragleave event gets
// fired, which stops the highlighting of the currently dragged cell. To avoid
// this problem and any coding around to fight it, everything has been
// programmed with the dragenter event handler only; no more dragleave needed
// For the dragenter event, e.target corresponds to the element into which the
// drag enters. This fact has been used to program the code as follows:
var previousRow = null;
function handleDragEnter(e) {
// Assure that dragenter code is only executed when entering an element (and
// for example not when entering a text node)
if (e.target.nodeType === 1) {
// Get the currently entered row
let currentRow = this.closest('tr');
// Check if the currently entered row is different from the row entered via
// the last drag
if (previousRow !== null) {
if (currentRow !== previousRow) {
// If so, remove the class responsible for highlighting it via CSS from
// it
previousRow.className = "";
}
}
// Each time an HTML element is entered, add the class responsible for
// highlighting it via CSS onto its containing row (or onto itself, if row)
currentRow.className = "ready-for-drop";
// To know which row has been the last one entered when this function will
// be called again, assign the previousRow variable of the global scope onto
// the currentRow from this function run
previousRow = currentRow;
}
}
이 코드는 초보자에게도 적합하도록 매우 기본적인 주석이 코드에 남았습니다. 희망이 당신을 도울 것입니다! 물론 위에서 언급 한 모든 이벤트 리스너를 각 테이블 셀에 추가해야합니다.