Что такое Drag and Drop (DnD) в веб-интерфейсах?

«Что такое Drag and Drop (DnD) в веб-интерфейсах?» — вопрос из категории Веб-тестирование, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Drag and Drop (DnD) — это механизм пользовательского интерфейса, позволяющий "захватить" элемент (мышью или касанием), переместить его и "отпустить" в целевой области.

Почему это сложно для тестирования? Требуется проверка корректности передачи данных, состояния интерфейса и поведения в разных браузерах.

Пример базовой реализации на JavaScript с использованием HTML5 API:

<!DOCTYPE html>
<div id="dragItem" draggable="true">Перетащи меня</div>
<div id="dropZone">Зона для сброса</div>

<script>
const dragItem = document.getElementById('dragItem');
const dropZone = document.getElementById('dropZone');

// 1. Событие начала перетаскивания
dragItem.addEventListener('dragstart', (event) => {
    event.dataTransfer.setData('text/plain', event.target.id);
    event.target.style.opacity = '0.5';
});

// 2. Событие над зоной сброса (ОБЯЗАТЕЛЬНО отменить по умолчанию)
dropZone.addEventListener('dragover', (event) => {
    event.preventDefault(); // Позволяет сбросить элемент
    dropZone.style.backgroundColor = 'lightblue';
});

// 3. Событие сброса элемента
dropZone.addEventListener('drop', (event) => {
    event.preventDefault();
    const data = event.dataTransfer.getData('text/plain');
    const draggedElement = document.getElementById(data);
    dropZone.appendChild(draggedElement);
    draggedElement.style.opacity = '1';
    dropZone.style.backgroundColor = '';
});
</script>

Ключевые аспекты для тестирования:

  1. Функциональность: Элемент можно взять, переместить и корректно сбросить.
  2. Целостность данных: Данные элемента не теряются после переноса.
  3. Обратная связь UI: Визуальные подсказки при перетаскивании (курсор, подсветка).
  4. Граничные случаи: Сброс в недопустимую зону, отмена операции.
  5. Кроссбраузерность: Работа в современных и legacy-браузерах.