Вопрос проверяет понимание причин постепенного снижения производительности drag-and-drop, связанных с накоплением обработчиков событий и утечками памяти.
Проблема часто связана с тем, как разработчики реализуют механизм перетаскивания. При каждом новом цикле drag-and-drop (mousedown -> mousemove -> mouseup) могут добавляться новые обработчики событий, но не удаляться старые. Со временем количество активных слушателей растёт, и браузер тратит всё больше ресурсов на их вызов, даже когда перетаскивание не активно.
// Проблемный код: обработчики не удаляются
let dragItem = document.getElementById('drag');
dragItem.addEventListener('mousedown', function(e) {
function onMouseMove(e) {
// дорогие вычисления
dragItem.style.left = e.clientX + 'px';
}
function onMouseUp() {
document.removeEventListener('mousemove', onMouseMove);
document.removeEventListener('mouseup', onMouseUp);
}
document.addEventListener('mousemove', onMouseMove);
document.addEventListener('mouseup', onMouseUp);
});
// Исправленный код: удаление обработчиков после завершения
dragItem.addEventListener('mousedown', function(e) {
const onMouseMove = (e) => {
requestAnimationFrame(() => {
dragItem.style.left = e.clientX + 'px';
});
};
const onMouseUp = () => {
document.removeEventListener('mousemove', onMouseMove);
document.removeEventListener('mouseup', onMouseUp);
};
document.addEventListener('mousemove', onMouseMove);
document.addEventListener('mouseup', onMouseUp);
});Для предотвращения деградации производительности drag-and-drop всегда удаляйте временные обработчики событий после завершения перетаскивания, используйте requestAnimationFrame для оптимизации частоты обновлений и избегайте создания лишних DOM-элементов без очистки. Это особенно важно в приложениях с длительной сессией пользователя.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию