2023-10-03 14:15 Czas czytania: 11 min

Jak korzystać z interfejsu API przeciągania i upuszczania HTML

Mechanizm "przeciągnij i upuść" stanowi kluczową funkcję, która podnosi poziom interakcji użytkownika ze stroną internetową oraz zapewnia płynność obsługi. Niezależnie od tego, czy projektujesz narzędzie do transferu plików, listę z opcją zmiany kolejności, czy też interaktywną grę, umiejętność efektywnego wykorzystania możliwości tego API jest niezwykle istotna w zestawie narzędzi każdego twórcy stron internetowych.

Podstawowe zasady działania "przeciągnij i upuść" w HTML

Typowy schemat operacji "przeciągnij i upuść" obejmuje dwa rodzaje elementów. Pierwszy to obiekty, które użytkownik może przesuwać za pomocą kursora, natomiast drugi typ to elementy docelowe, określające miejsca, w których użytkownik może upuścić przesuwany obiekt.

Aby wdrożyć funkcję przeciągania i upuszczania, konieczne jest zdefiniowanie w kodzie, które elementy mają być przesuwane. W tym celu, element musi zawierać atrybut HTML, który zezwala na przeciąganie. Atrybut ten powinien mieć wartość ustawioną na "true", zgodnie z poniższym przykładem:

 <div draggable="true">Ten element można przeciągać</div>

W momencie rozpoczęcia operacji przeciągania, przeglądarka wyświetla standardowy obraz "ducha", który zazwyczaj informuje o przeciąganym elemencie.

Istnieje możliwość dostosowania tego obrazu i zastąpienia go własnym. W tym celu należy wybrać element przeciągany z modelu DOM, utworzyć nowy obraz reprezentujący niestandardowy "duch" oraz dodać detektor zdarzenia "dragstart", tak jak w poniższym przykładzie:

 let img = new Image();
img.src="https://upload.wikimedia.org/wikipedia/commons/thumb/9/90/Twemoji_1f600.svg/220px-Twemoji_1f600.svg.png";

document.querySelector('div').addEventListener('dragstart', (event)=>{
event.dataTransfer.setDragImage(img, 10, 10);
})

W zaprezentowanym fragmencie kodu metoda "setDragImage" przyjmuje trzy parametry. Pierwszy z nich wskazuje na obraz. Dwa kolejne określają przesunięcie obrazu w poziomie i pionie. Po uruchomieniu tego kodu w przeglądarce i próbie przeciągnięcia elementu, widoczny będzie nowy, niestandardowy obraz zamiast domyślnego "ducha".

Aby umożliwić upuszczanie elementów, należy zapobiec domyślnemu zachowaniu przeglądarki poprzez anulowanie zdarzeń "dragenter" oraz "dragover", jak pokazano poniżej:

 const dropElement = document.querySelector("drop-target");

dropElement.addEventListener("dragenter", (ev) => {
ev.preventDefault();
});

dropElement.addEventListener("dragover", (ev) => {
ev.preventDefault();
});

Zrozumienie interfejsu DragEvent

JavaScript posiada interfejs o nazwie "DragEvent", który reprezentuje interakcję użytkownika związaną z funkcją "przeciągnij i upuść". Poniżej znajduje się lista możliwych typów zdarzeń w ramach tego interfejsu:

  • "drag": Zdarzenie wywoływane w trakcie przesuwania elementu przez użytkownika.
  • "dragend": Zdarzenie aktywowane po zakończeniu operacji przeciągania lub w momencie jej przerwania przez użytkownika (np. zwolnienie przycisku myszy lub naciśnięcie klawisza Escape).
  • "dragenter": Zdarzenie wywoływane, gdy przeciągany element wejdzie w obszar potencjalnego miejsca upuszczenia.
  • "dragleave": Zdarzenie wywoływane, gdy element przeciągany opuszcza obszar potencjalnego miejsca upuszczenia.
  • "dragover": Zdarzenie wywoływane podczas przesuwania przeciąganego elementu nad obszarem docelowym.
  • "dragstart": Zdarzenie aktywowane na początku procesu przeciągania.
  • "drop": Zdarzenie wywoływane w momencie upuszczenia elementu przez użytkownika na obszarze docelowym.

W sytuacji, gdy użytkownik przeciąga plik do okna przeglądarki z zewnątrz (np. z menedżera plików), przeglądarka nie wywoła zdarzeń "dragstart" ani "dragend".

Interfejs "DragEvent" może być przydatny w przypadku, gdy chcesz programowo wywołać niestandardowe zdarzenie przeciągania. Na przykład, jeśli zależy Ci, aby element div wywoływał niestandardowe zdarzenia przeciągania zaraz po załadowaniu strony, możesz to zrealizować w następujący sposób. Najpierw utwórz nowy, niestandardowy obiekt "DragEvent()":

 const customDragStartEvent = new DragEvent('dragstart', {
dataTransfer: new DataTransfer(),
})

const customDragEndEvent = new DragEvent('dragend');

W powyższym kodzie, "customDragStartEvent" jest instancją obiektu "DragEvent()". Konstruktor tego obiektu przyjmuje dwa argumenty. Pierwszy z nich określa rodzaj zdarzenia przeciągania, które może być jednym z siedmiu wcześniej wymienionych typów zdarzeń.

Drugi argument to obiekt z kluczem "dataTransfer", który reprezentuje instancję obiektu "DataTransfer". Szczegóły jego działania zostaną omówione w dalszej części artykułu. Następnie, należy pobrać z modelu DOM element, dla którego chcemy wywołać zdarzenie:

 const draggableElement = document.querySelector("#draggable");

Kolejnym krokiem jest dodanie słuchaczy zdarzeń w następujący sposób:

  draggableElement.addEventListener('dragstart', (event) => {
console.log('Przeciąganie rozpoczęte!');
event.dataTransfer.setData('text/plain', 'Witaj, świecie!');
});

draggableElement.addEventListener('dragend', () => {
console.log('Przeciąganie zakończone!');
});

W pierwszym słuchaczu zdarzeń funkcja wywołania zwrotnego rejestruje komunikat "Przeciąganie rozpoczęte!" i aktywuje metodę "setData" na właściwości "dataTransfer" obiektu zdarzenia. W tym momencie można wyzwalać niestandardowe zdarzenia, takie jak:

 draggableElement.dispatchEvent(customDragStartEvent);
draggableElement.dispatchEvent(customDragEndEvent);

Przekazywanie danych za pomocą DataTransfer

Obiekt "dataTransfer" pełni rolę łącznika pomiędzy elementem źródłowym (elementem, który można przeciągać) a elementem docelowym (obszarem, na którym można upuścić element). Jest to tymczasowy kontener, w którym przechowywane są dane przesyłane pomiędzy tymi elementami podczas operacji przeciągania i upuszczania.

Dane te mogą mieć różną formę, np. tekst, adresy URL czy też niestandardowe typy danych. To czyni obiekt "dataTransfer" uniwersalnym narzędziem, które znajduje zastosowanie w wielu implementacjach "przeciągnij i upuść".

Użycie metody "setData()" do pakowania danych

Aby przesłać dane z elementu przeciąganego do elementu docelowego, należy użyć metody "setData()", która jest udostępniana przez obiekt "dataTransfer". Metoda ta umożliwia umieszczenie danych, które mają być przekazane, i określenie ich typu. Przykładowy kod:

 element.addEventListener('dragstart', (event) => {
event.dataTransfer.setData('text/plain', 'Witaj, świecie!');
});

W momencie rozpoczęcia przeciągania, metoda "setData()" umieszcza tekst "Witaj, świecie!" wraz z typem danych "text/plain" w obiekcie "dataTransfer". Dane te są powiązane ze zdarzeniem przeciągania, a element docelowy może uzyskać do nich dostęp podczas operacji upuszczania.

Pobieranie danych za pomocą metody "getData()"

Po stronie odbierającej, w słuchaczu zdarzeń elementu docelowego, można pobrać przesłane dane za pomocą metody "getData()":

 element.addEventListener('drop', (event) => {
const transferredData = event.dataTransfer.getData('text/plain');
console.log(`Otrzymane dane: ${transferredData}`);
});

Powyższy fragment kodu pobiera dane o tym samym typie ("text/plain"), który został wcześniej ustawiony za pomocą metody "setData()". W ten sposób, można uzyskać dostęp do przesłanych danych i modyfikować je w kontekście elementu docelowego.

Zastosowania interfejsów "przeciągnij i upuść"

Włączenie funkcji "przeciągnij i upuść" do aplikacji internetowych może znacząco poprawić wygodę użytkowania. Ważne jest jednak, aby zrozumieć, kiedy i dlaczego należy stosować to rozwiązanie.

  • Przesyłanie plików: umożliwienie użytkownikom przeciągania plików bezpośrednio z pulpitu lub menedżera plików do wyznaczonego obszaru upuszczania, znacząco upraszcza proces przesyłania.
  • Listy z opcją sortowania: jeśli aplikacja prezentuje listy elementów, takie jak lista zadań, lista odtwarzania czy galeria obrazów, użytkownicy mogą docenić możliwość zmiany ich kolejności za pomocą "przeciągnij i upuść".
  • Interaktywne pulpity nawigacyjne: w narzędziach do wizualizacji danych i raportowania, "przeciągnij i upuść" może być skutecznym sposobem na dostosowywanie układu pulpitów nawigacyjnych poprzez zmianę położenia widżetów i wykresów.

Dostępność interfejsów "przeciągnij i upuść"

Choć funkcja "przeciągnij i upuść" jest atrakcyjna wizualnie i podnosi komfort użytkowania, niezwykle istotne jest zadbanie o dostępność jej implementacji dla wszystkich użytkowników, w tym osób z niepełnosprawnościami. Należy zapewnić alternatywne metody interakcji, takie jak sterowanie klawiaturą, aby aplikacja była wszechstronna.

Marta Wysocka
Autor
Polska

Przygotowuje podsumowania oparte na researchu, pomagające czytelnikom w decyzjach.

Poprzedni artykuł
Twórz instrukcje informacyjne za pomocą tych 11 instrukcji obsługi oprogramowania
Następny artykuł
Jak zautomatyzować pliki wsadowe za pomocą Harmonogramu zadań w systemie Windows