Проблема перетаскивания.
Проблема в том, что вы присоединяете к документу несколько слушателей перемещения мыши, и каждый из них имеет каждый из основных элементов.
Решение:
Запомните, какой элемент мы собираемся переместить.
mainElement.addEventListener("mousedown", function (e) {
isDown = true;
element = mainElement;
offset = [
mainElement.offsetLeft - e.clientX,
mainElement.offsetTop - e.clientY
];
});
В внешней области видимости (за пределами foreach) создайте уникальный слушатель события mousemove и обновите элемент , о котором мы упоминали ранее.
document.addEventListener("mousemove", function (e) {
e.preventDefault();
mousePosition = {
x: e.clientX,
y: e.clientY
};
let left = (mousePosition.x + offset[0]);
let top = (mousePosition.y + offset[1]);
if(isDown){
if(mapContainer.offsetTop < top && mapContainer.offsetWidth > left){
element.style.left = left + 'px';
element.style.top = top + 'px';
}
}
});
Другими способами решения этой проблемы является создание (и удаление) обработчика событий в обработчиках событий mousedown и mouseup соответственно.Но я считаю, что это менее эффективно и определенно сложнее.