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

Ответ

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-браузерах.

Ответ 18+ 🔞

О, а вот эта штука — Drag and Drop! Ну, классика жанра, блядь. Вроде как взял элемент, потащил его куда-то и бросил. Просто, да? Ага, щас, как же, ёпта!

На деле это пиздец какой-то цирк с конями, особенно когда начинаешь это всё тестировать. Представь: ты тащишь какой-нибудь файлик или блок, а он тебе в середине пути возьми и сдохни, или данные потеряй, или в браузере старом вообще нихуя не работать. Вообще, блядь, доверия к этой технологии — ноль ебать.

Вот смотри, как это в лоб делается на ванильном JS. Тут главное — не перемудрить и не нагородить хуйни.

<!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. Кроссбраузерность. Ах да, священная корова. В Хроме работает? Отлично. А в каком-нибудь древнем Firefox или, прости господи, Safari? Там может быть свой особый взгляд на стандарты, и всё пойдёт по пизде. Надо проверять везде, иначе пользователи начнут материться, и будут правы, сука.

В общем, Drag and Drop — это как ебаться с медведем в берлоге: в теории всё просто, а на практике можно получить по ебалу неожиданно и со всех сторон.