JS об'єкт DragEvent


Загальний опис

DragEvent є набором подій, які JavaScript забезпечує для обробки дій перетягування елементів на сторінці. Вони дозволяють реалізувати інтерактивне переміщення елементів, взаємодію між ними та з іншими частинами сторінки. Основні події, що входять у набір "DragEvent", включають dragstart, drag, dragenter, dragover, dragleave, drop та dragend. Кожна з них призначена для відстеження конкретних моментів у процесі перетягування.

Подія dragstart виникає, коли користувач починає перетягувати елемент, і є стартовою точкою в процесі перетягування. У цьому випадку зазвичай додають дані до об’єкта DataTransfer, щоб визначити, які саме дані будуть перенесені, або змінюють стиль елемента.

element.addEventListener('dragstart', (event) => {
  event.dataTransfer.setData('text/plain', event.target.id);
});

Події drag і dragover викликаються під час самого перетягування. dragover є важливою подією, оскільки за замовчуванням елементи не допускають подію drop, і для активації можливості "скидання" необхідно викликати event.preventDefault() у dragover.

element.addEventListener('dragover', (event) => {
  event.preventDefault(); // дозволяє скидання
});

Події dragenter та dragleave допомагають відслідковувати момент, коли елемент входить в область іншого елемента або покидає її. Їх можна використовувати для зміни стилю елемента, над яким проходить перетягування, що додає інтерактивності.

Остання фаза перетягування — drop, де відбувається "скидання" елемента, тобто його розміщення на цільовому місці. Використовуючи drop, можна отримати дані, які були встановлені у dragstart, і провести подальшу обробку.

element.addEventListener('drop', (event) => {
  event.preventDefault();
  const data = event.dataTransfer.getData('text/plain');
  console.log(`Отримані дані: ${data}`);
});

Заключна подія, dragend, запускається після завершення перетягування, незалежно від того, де відбулося скидання. Це зручно для скидання стилів або стану елементів.

автор: Bond

Порада

Щоб зберегти стильний вигляд під час перетягування, можна використовувати dragenter та dragleave для додавання/зняття спеціального класу стилю на елементі, що служить ціллю. Це забезпечить візуальне виділення елемента, коли над ним проходить перетягування.

автор: Bond
Порада

Якщо ви перетягуєте текст між полями, замість text/plain, встановіть text/html у DataTransfer, щоб зберігати стилі. Це особливо корисно для зберігання відформатованого тексту.

автор: Bond
Порада

Щоб скинути стилі або візуальні ефекти після завершення перетягування, використовуйте dragend. Наприклад, змінюючи стилі для скидання стану після перетягування, ви зможете надати користувачу більш зрозумілий і точний інтерфейс.

автор: Bond

Синтаксис

element.addEventListener('dragstart', (event) => {
  // код, що виконується під час початку перетягування
});

element.addEventListener('dragover', (event) => {
  // код, що виконується під час перетягування над цільовим елементом
});

element.addEventListener('drop', (event) => {
  // код, що виконується під час завершення перетягування
});

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
46 3.5 14 12 12 9
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
46 46 4 14

Приклади

+ запропонувати свій приклад у пісочниці

Цей приклад демонструє можливість сортування списку елементів за допомогою перетягування. Використовуючи dragstart і dragend, ми змінюємо стиль перетягуваного елемента, а в drop розміщуємо елемент у новій позиції, дозволяючи користувачу легко змінювати порядок елементів.

HTML

<div class="item">перший елемент item</div>
<div class="item">другий елемент item</div>

JS

let draggedItem = null;

document.querySelectorAll('.item').forEach((item) => {
  item.addEventListener('dragstart', (event) => {
    draggedItem = event.target;
    event.target.style.opacity = 0.5;
  });

  item.addEventListener('dragend', (event) => {
    event.target.style.opacity = '';
    draggedItem = null;
  });

  item.addEventListener('dragover', (event) => {
    event.preventDefault();
  });

  item.addEventListener('drop', (event) => {
    event.preventDefault();
    if (draggedItem && draggedItem !== event.target) {
      event.target.parentNode.insertBefore(draggedItem, event.target.nextSibling);
    }
  });
});
автор: Bond

У цьому прикладі ми переносимо текстовий вміст елемента з одного списку в інший. Код дозволяє користувачу перетягувати дані з .source в .target, що може бути корисним для формування списків або вибору.

HTML

<div class="target">перший елемент target</div>
<div class="target">другий елемент target</div>

JS

let draggedData = null;

document.querySelectorAll('.source .item').forEach((item) => {
  item.addEventListener('dragstart', (event) => {
    draggedData = event.target.innerText;
    event.target.style.backgroundColor = 'gray';
  });

  item.addEventListener('dragend', (event) => {
    event.target.style.backgroundColor = '';
  });
});

document.querySelectorAll('.target').forEach((target) => {
  target.addEventListener('dragover', (event) => {
    event.preventDefault();
  });

  target.addEventListener('drop', (event) => {
    event.preventDefault();
    if (draggedData) {
      event.target.innerText += draggedData;
      draggedData = null;
    }
  });
});
автор: Bond

Цей приклад дозволяє користувачеві перетягувати завдання з початкового списку до завершених. Після того як завдання переміщене у "Завершено", воно залишається там. Користувач також може очистити завершені завдання натисканням кнопки "Очистити завершені".

автор: Bond

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле саме підкаже шляхи, а хибний підкреслить хвилею.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Пропозиція правки

Ваша версія — : після перевірки замінить чинну. Нова порада чи нотатка — з'явиться на сторінці після перевірки.

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле саме підкаже шляхи, а хибний підкреслить хвилею.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія секції «»: після перевірки замінить чинну.

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле саме підкаже шляхи, а хибний підкреслить хвилею.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія опису «»: після перевірки замінить чинну.

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле саме підкаже шляхи, а хибний підкреслить хвилею.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Зворотний зв'язок
Вхід