Przeciągnij i upuść JavaScript
Podsumowanie: w tym samouczku dowiesz się o API JavaScript do przeciągania i upuszczania.
Wprowadzenie do JavaScript API Drag and Drop
HTML5 formalnie wprowadził specyfikację przeciągania i upuszczania. Większość nowoczesnych przeglądarek internetowych ma zaimplementowane natywne przeciąganie i upuszczanie na podstawie specyfikacji HTML5.
Domyślnie można przeciągać tylko obrazy i tekst. Aby przeciągnąć obraz, po prostu przytrzymaj przycisk myszy, a następnie przesuń go. Aby przeciągnąć tekst, musisz podświetlić tekst i przeciągnąć go w taki sam sposób, jak przeciągasz obraz.
HTML5 określa, że prawie wszystkie elementy można przeciągać. Aby element był możliwy do przeciągania, dodaj właściwość draggable
z wartością true
do jego tagu HTML. Na przykład:
Code language: HTML, XML (xml)
Zdarzenia na elementach do przeciągania
Podczas przeciągania elementu zdarzenia te uruchamiają się w następującej kolejności:
-
dragstart
-
drag
-
dragend
Gdy przytrzymasz przycisk myszy i zaczniesz ją przesuwać, zdarzenie dragstart
jest uruchamiane na elemencie, który można przeciągać że przeciągasz. Kursor zmieni się w symbol bez upuszczania (okrąg z przekreśloną linią), aby wskazać, że nie możesz upuścić elementu na siebie.
Po dragstart
zdarzenie jest uruchamiane, zdarzenie drag
jest uruchamiane wielokrotnie, o ile przeciągasz element.
I dragend
uruchamia się zdarzenie kiedy przestaniesz przeciągać element.
Celem wszystkich zdarzeń (e.target
) jest przeciągany element.
Domyślnie , przeglądarka nie zmienia wyglądu przeciągniętego elementu. Dlatego możesz dostosować jego wygląd na podstawie własnych preferencji.
Zdarzenia w miejscach docelowych upuszczania
Po przeciągnięciu elementu na prawidłowy cel upuszczania zdarzenia te uruchamiają się w następującej kolejności:
-
dragenter
-
dragover
-
dragleave
lubdrop
dragenter
uruchamia się tak szybko podczas przeciągania elementu nad miejsce docelowe upuszczania.
Po wywołaniu zdarzenia dragenter
, zdarzenie dragover
jest uruchamiane wielokrotnie tak długo, jak przeciągasz element w granicach celu upuszczania.
Gdy przeciągasz element poza granicę celu upuszczania, dragover
zdarzenie przestaje działać, a dragleave
zdarzenie zostaje uruchomione.
W przypadku upuszczenia elementu w miejscu docelowym drop
zdarzenie jest uruchamiane zamiast zdarzenia dragleave
.
Cel (dragenter
, dragover
, dragleave
i drop
są elementami docelowymi upuszczania.
Prawidłowy cel upuszczania
Prawie wszystkie elementy obsługują zdarzenia docelowe upuszczania (dragenter
, dragover
, dragleave
i drop
). Jednak domyślnie nie zezwalają na upuszczanie.
Jeśli upuścisz element nad celem upuszczenia, który nie pozwala na upuszczenie, wygrywa zdarzenie drop
Nie uruchamia się.
Aby zmienić element w prawidłowy cel upuszczania, możesz zastąpić domyślne zachowanie zarówno dragenter
, jak i dragover
przez wywołanie metody event.preventDefault()
w odpowiednich programach obsługi zdarzeń. (Zobacz sekcję z przykładami, aby uzyskać więcej informacji)
Transfer danych przy użyciu obiektu dataTransfer
Aby przenieść dane metodą przeciągnij i upuść, użyj funkcji dataTransfer
.
Obiekt dataTransfer
jest właściwością zdarzenia. Umożliwia przesyłanie danych z przeciągniętego elementu do miejsca docelowego.
Obiekt dataTransfer
ma dwie metody: setData()
i getData()
.
setData()
pozwala ustawić dane operacji przeciągania na określony format i dane :
Code language: CSS (css)
Może to być text/plain
lub text/uri-list
. Dane mogą być łańcuchem reprezentującym dane do dodania do obiektu przeciągania.
Metoda getData()
pobiera dane przeciągania przechowywane przez setData()
.
getData()
akceptuje jeden argument:
Może mieć format text/plain
lub text/uri-list
. getData()
zwraca ciąg przechowywany przez metodę setData()
lub pusty ciąg, jeśli operacja przeciągania nie obejmuje danych.
Przykład przeciągania i upuszczania JavaScript
Opracujemy następującą prostą aplikację typu „przeciągnij i upuść”, aby zademonstrować interfejs API przeciągania i upuszczania JavaScript:
Utwórz struktura projektu
Najpierw utwórz nowy folder o nazwie drag-n-drop-basics
. W tym folderze utwórz dwa podfoldery o nazwach css
i js
.
Po drugie, utwórz nowy plik o nazwie app.js
w folderze js
, style.css
w css
i index.html
w folderze drag-n-drop-basics
.
Po trzecie, umieść link do style.css
i tag skryptu, który prowadzi do app.js
w pliku index.html
w następujący sposób:
Zbuduj plik index.html
Umieść następujący kod w pliku index.html
:
W tym pliku index.html, użyliśmy elementu .container
, aby wyrównać nagłówek i element drop-targets
.
Wewnątrz elementu drop-target, umieścił trzy elementy div
z tą samą klasą box
. W pierwszym polu umieścimy kolejny element div z klasą item
.
Jeśli otworzysz index.html
i spróbuj przeciągnąć żółte pole, zobaczysz kursor wskazujący, że nie możesz przeciągać:
Aby umożliwić przeciąganie elementu, dodaj właściwość draggable
o wartości true
do swojego tagu HTML w następujący sposób:
Code language: JavaScript (javascript)
Teraz, jeśli zapiszesz index.html
, otwórz go w przeglądarce znowu zobaczysz, że możesz przeciągnąć element item w ten sposób:
Obsługa zdarzeń w elemencie przeciągalnym
Plik style.css
ma .hide
klasa, która ukrywa element:
Code language: CSS (css)
W pliku app.js
dodajesz następujący kod:
W jaki sposób t działa:
- Najpierw wybierz element do przeciągania za pomocą
querySelector()
. - Po drugie, dołącz
dragstart
obsługi zdarzeń do elementu przeciągalnego. - Po trzecie, zdefiniuj funkcję
dragStart()
do obsługidragstart
zdarzenie.
Jeśli otworzysz plik index.html i zaczniesz przeciągać element do przeciągania, zobaczysz komunikat drag starts...
w konsoli.
W module obsługi zdarzeń dragStart
, musisz zapisać id
elementu, który można przeciągać. I musisz to ukryć:
Jeśli przeciągniesz element, zobaczysz, że znika on po rozpoczęciu przeciągania.
Aby rozwiązać ten problem, użyj setTimeout()
:
Teraz możesz przeciągnąć element do przeciągania z jego pierwotnej pozycji:
Obsługa zdarzeń w miejscach docelowych upuszczania
Plik style.css ma również klasę CSS o nazwie .drag-over
, który zmienia styl obramowania celu upuszczenia na przerywany i czerwony:
Code language: CSS (css)
W pliku app.js potrzebujesz aby wybrać elementy docelowe upuszczania i obsłużyć dragenter
, dragover
, dragleave
i drop
zdarzenia tych elementów:
Styl obramowania celu upuszczenia powinien się zmienić, gdy dragenter
i dragover
wystąpi zdarzenie. Powinien przywrócić styl po wystąpieniu zdarzenia dragleave
i drop
.
Aby to zrobić, dodaj i usuń klasę drag-over
do drop
celu w następujący sposób:
Teraz, jeśli przeciągniesz element do przeciągania do innej kropli docelowy, zobaczysz, że krawędź celu upuszczenia zmienia się, jak pokazano na poniższym obrazku:
Aby cel upuszczenia był prawidłowy, musisz zadzwonić pod numer event.preventDefault()
w dragenter
i dragover
programy obsługi zdarzeń, takie jak ta:
Jeśli tego nie zrobisz, zdarzenie drop
nigdy nie odpalić, ponieważ element div
nie jest domyślnie prawidłowym celem upuszczania.
Jeśli przeciągniesz element do przeciągania do miejsca docelowego, zobaczysz, że kursor zmiany wskazujące na możliwość usunięcia elementu:
Teraz, jeśli upuścisz element item, zobaczysz, że znika on natychmiast.
Aby rozwiązać ten problem musisz dodać obsługę zdarzenia drop
.
- Najpierw pobierz
id
elementu do przeciągania za pomocą metodygetData()
zdataTransfer
obiekt. - Po drugie, dołącz element do przeciągania jako element podrzędny elementu docelowego upuszczania.
- Po trzecie, usuń
hide
z elementudraggable
.
Poniższy kod przedstawia kompletną drop
moduł obsługi zdarzeń:
Jeśli teraz przeciągniesz i upuścisz element do przeciągania, powinien on działać zgodnie z oczekiwaniami.
Poniżej przedstawiono kompletny plik app.js:
A oto link do demo.
Podsumowanie
- Dodaj właściwość
draggable
o wartości true do elementu, aby można go było przeciągać. -
dragstart
,drag
idragend
zdarzenia uruchamiają się na elemencie przeciągalnym. -
dragenter
,dragover
, lubdrop
uruchamiają się w miejscu docelowym. - Zadzwoń pod numer
event.preventDefault()
nadragenter
idragover
programy obsługi zdarzeń, aby uczynić z elementu prawidłowy cel upuszczania. - Użyj
event.dataTransfer
z metodamisetData()
igetData()
do przesyłania danych w operacji przeciągania i upuszczania.
- Czy ten samouczek był pomocny?
- Tak Nie