これらのすべての回答を読んだ後でも、これでLOTに苦労し、解決策をあなたと共有できると思いました。私の考えは、単にdragleave
イベントリスナーを完全に dragenterイベントが不必要に発生しないようにしながら、dragenterイベントが発生するたびにdragleave動作をコーディングすることでした。
以下の私の例では、テーブルがあり、ドラッグアンドドロップ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;
}
}
非常に基本的なコメントがコードに残されているため、このコードは初心者にも適しています。これがあなたを助けることを願っています!もちろん、これが機能するためには、前述のすべてのイベントリスナーを各テーブルセルに追加する必要があります。