1

I have a problem with this code because it work perfectly on laptops and desktop devices but not on mobile devices , please help me and tell me what are the things to add so it will work for both. I added the touch events but it didn't work This is the my Js code :

const draggableElements = document.querySelectorAll(".draggable");
const droppableElements = document.querySelectorAll(".droppable");


draggableElements.forEach(elem => {
  elem.addEventListener("dragstart", dragStart);
  elem.addEventListener("touchstart", dragStart);
});

droppableElements.forEach(elem => {
  elem.addEventListener("dragenter", dragEnter); 
  elem.addEventListener("dragover", dragOver ); 
  elem.addEventListener("dragleave", dragLeave);
  elem.addEventListener("drop", drop);
  elem.addEventListener("touchstart", dragEnter); 
  elem.addEventListener("touchmove", dragOver ); 
  elem.addEventListener("touchend", drop);
  elem.addEventListener("touchcancel", dragLeave);
});

function dragStart(event) {
  event.dataTransfer.setData('text/plain', event.target.id);
  setTimeout(() => {
      event.target.classList.add('hide');
  }, 0);
}


function dragEnter(event) {
  event.preventDefault();
  event.target.classList.add('droppable-hover');
}

function dragOver(event) {
  event.preventDefault();
  event.target.classList.add('droppable-hover');
}

function dragLeave(event) {
  event.target.classList.remove('droppable-hover');
}


function drop(event) {
  event.preventDefault();
  var id = event.dataTransfer.getData("text/plain");
  var draggedElement = document.getElementById(id);
  var container = event.target.closest(".droppable");
  if (container && draggedElement) {
    var existingImage = container.querySelector("img");
    if (existingImage) {
      const draggableContainer = document.querySelector(".draggable");
      container.removeChild(existingImage);
      draggableContainer.appendChild(existingImage);
      container.appendChild(draggedElement);
    }
    existingImage = draggedElement;
  }
} 
Manar Mani
  • 11
  • 1

1 Answers1

1

Unfortunately Drag & Drop on mobile can be a bit sketchy.

The good news is that you can pollyfill these issues.

Have a look here -> https://www.npmjs.com/package/drag-drop-touch

Keith
  • 22,005
  • 2
  • 27
  • 44
  • The readme doesnt even tell you how to use it – Cybernetic Aug 05 '23 at 20:55
  • 2
    @Cybernetic It's a polyfill, IOW: The docs are the standard, -> https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API You basically include this in your Javasript and it will implement the drag & drop spec for mobile devices. If you make drag & drop work in Desktop, placing this pollyfill in your Javascript will then make mobile work too. – Keith Aug 05 '23 at 21:02