Я бы предложил вам создать перетаскиваемые элементы для каждого слова после загрузки файла:
<span class="word" draggable="true">word</span>
Так что тогда вы можете применить стандартное HTML5 поведение перетаскивания к этим span
элементы. Проверьте пример ниже:
const words = 'words from file';
const container = document.getElementById('container');
let dragged;
container.innerHTML = words.split(' ').map(w => `<span class="word" draggable="true">${w}</span>`).join('');
function onDragOver(event) {
// Prevent default to allow drop
event.preventDefault();
}
function onDragLeave(event) {
event.target.style.background = '';
}
function onDragEnter(event) {
const target = event.target;
if (target && dragged && target.classList.contains('drop-zone')) {
event.preventDefault();
// Set the dropEffect to move
event.dataTransfer.dropEffect = 'move'
target.style.background = '#1f904e';
}
}
function onDrop(event) {
const target = event.target;
if (target && dragged && target.classList.contains('drop-zone')) {
target.style.backgroundColor = '';
event.preventDefault();
// Get the id of the target and add the moved element to the target's DOM
dragged.parentNode.removeChild(dragged);
dragged.style.opacity = '';
target.appendChild(dragged);
}
}
function onDragStart(event) {
dragged = event.target;
event.dataTransfer.setData('text', event.target.id);
event.dataTransfer.dropEffect = 'move';
// Make it half transparent
event.target.style.opacity = .3;
}
function onDragEnd(event) {
// Reset the transparency
event.target.style.opacity = ''; // reset opacity when drag ends
dragged = null;
}
for (word of document.getElementsByClassName('word')) {
word.addEventListener('dragstart', onDragStart);
word.addEventListener('dragend', onDragEnd);
}
for (dropZone of document.getElementsByClassName('drop-zone')) {
dropZone.addEventListener('drop', onDrop);
dropZone.addEventListener('dragenter', onDragEnter);
dropZone.addEventListener('dragleave', onDragLeave);
dropZone.addEventListener('dragover', onDragOver);
}
.drop-zone {
position: relative;
width: 100px;
height: 30px;
overflow: hidden;
background: #878787;
color: white;
display: flex;
align-items: center;
justify-content: center;
margin: 5px 0;
}
.word {
margin: 0 2px;
}
<div id=container></div>
<div class='drop-zone'></div>
<div class='drop-zone'></div>
<div class='drop-zone'></div>