Klasy używane do manipulacji DOM/obsługi zdarzeń w TypeScript
W tym artykule wyjaśnimy klasy używane do manipulacji DOM/obsługi zdarzeń w TypeScript.
Możesz dowiedzieć się o klasie Document, klasach Element i NodeList oraz różnych klasach związanych ze zdarzeniami, korzystając z przykładów kodu.
YouTube Video
Klasy używane do manipulacji DOM/obsługi zdarzeń w TypeScript
Do manipulacji DOM i obsługi zdarzeń w TypeScript głównie używane są interfejsy Document Object Model (DOM). W manipulacji DOM i obsłudze zdarzeń używa się standardowych klas i interfejsów JavaScript, ale w TypeScript dodawane są informacje o typach, co umożliwia bezpieczniejszą operację.
Poniżej opisano klasy i interfejsy najczęściej używane w manipulacji DOM i obsłudze zdarzeń.
Główne klasy/interfejsy używane do manipulacji DOM
Document
Document to obiekt reprezentujący dokumenty HTML lub XML. Używany do dostępu do drzewa DOM lub wyszukiwania elementów.
Przykład kodu
1// Get the element using getElementById
2const element = document.getElementById('myElement') as HTMLDivElement | null;
3if (element) {
4 element.textContent = 'Hello, TypeScript!';
5}
6
7// querySelector can specify a generic type for more precise typing
8const button = document.querySelector<HTMLButtonElement>('#myButton');
9button?.addEventListener('click', () => {
10 console.log('Button clicked!');
11
12 // Create a new element dynamically
13 const newDiv = document.createElement('div');
14 newDiv.textContent = 'New element created!';
15 document.body.appendChild(newDiv);
16});Główne Metody
getElementByIdpobiera element o określonym atrybucieid.querySelectorpobiera element za pomocą selektora CSS.createElementtworzy nowy element HTML.
Wyjaśnienie kodu
- Ten kod pobiera element z atrybutem
idza pomocągetElementByIdi zmienia jego tekst. Pozyskuje również element przycisku za pomocąquerySelectori dodaje nasłuchiwacz zdarzenia kliknięcia. Po kliknięciu tworzy nowy elementdivza pomocącreateElementi dodaje go do głównej zawartości. Szablony generyczne i asercje typów są używane w celu zapewnienia bezpieczeństwa typów podczas operacji na DOM.
Element
Element to interfejs reprezentujący pojedyncze elementy HTML w DOM. Najczęściej używany podczas manipulacji DOM.
Przykład kodu
1// Use querySelector to manipulate element properties
2const divElement = document.querySelector<HTMLDivElement>('.myClass');
3if (divElement) {
4 // Set innerHTML
5 divElement.innerHTML = '<strong>Hello with innerHTML!</strong>';
6
7 // Set textContent
8 divElement.textContent = 'Hello with textContent!';
9
10 // Add a new class
11 divElement.classList.add('newClass');
12
13 // Set a custom attribute
14 divElement.setAttribute('data-role', 'content');
15}Główne właściwości i metody
- Właściwość
innerHTMLpozwala ustawić lub pobrać zawartość HTML elementu. - Właściwość
textContentpozwala ustawić lub pobrać tekstową zawartość elementu. classListto właściwość służąca do manipulowania klasami, umożliwiająca dodawanie, usuwanie i przełączanie klas.- Metoda
setAttributeustawia atrybut na elemencie.
Wyjaśnienie kodu
- Ten kod pokazuje przykład ustawiania zawartości za pomocą
innerHTMLitextContentdla elementów pobieranych przezquerySelector, dodawania klas za pomocąclassListoraz ustawiania własnych atrybutów za pomocąsetAttribute. Operacje są wykonywane w sposób bezpieczny typowo dzięki użyciu generyków.
NodeList i HTMLCollection
NodeList i HTMLCollection reprezentują kolekcje, które zawierają wiele elementów DOM. Na przykład, querySelectorAll zwraca NodeList, a getElementsByClassName zwraca HTMLCollection.
Przykład kodu
1// NodeList supports forEach iteration
2const divs: NodeListOf<HTMLDivElement> = document.querySelectorAll('div');
3divs.forEach(div => {
4 div.textContent = 'Updated!';
5});
6
7// HTMLCollection is not directly iterable, convert it to an array
8const spans: HTMLCollectionOf<HTMLSpanElement> =
9 document.getElementsByClassName('span-item') as HTMLCollectionOf<HTMLSpanElement>;
10Array.from(spans).forEach(span => {
11 span.textContent = 'Changed!';
12});- Ten kod pokazuje bezpośrednią obsługę
NodeListza pomocąforEachoraz konwersjęHTMLCollectionna tablicę w celu iteracji.
Główne klasy/interfejsy używane do obsługi zdarzeń
Event
Event to klasa bazowa dla wszystkich zdarzeń występujących w DOM. Różne zdarzenia, takie jak kliknięcia, wprowadzanie danych czy ładowanie strony, rozszerzają klasę Event.
Przykład kodu
1const form = document.querySelector<HTMLFormElement>('#myForm');
2form?.addEventListener('submit', (event: Event) => {
3 // target refers to the element that triggered the event (the form)
4 const target = event.target as HTMLFormElement;
5
6 // type shows the kind of event, e.g., "submit"
7 console.log(`Event type: ${event.type}`);
8
9 // preventDefault disables the default form submission
10 event.preventDefault();
11 console.log('Form submission prevented.');
12});Główne właściwości i metody
- Właściwość
targetreprezentuje element (EventTarget), na którym wystąpiło zdarzenie. typeoznacza typ zdarzenia, które wystąpiło, np.clicklubinput.- Metoda
preventDefaultanuluje domyślną akcję zdarzenia.
Wyjaśnienie kodu
- Ten kod demonstruje, jak dodać nasłuchiwacz zdarzenia
submitdo formularza.targetodnosi się do elementu formularza, w którym wystąpiło zdarzenie, atypewskazuje rodzaj zdarzenia (w tym przypadku,"submit"). Wywołując metodępreventDefault, można wyłączyć domyślne zachowania formularza, takie jak nawigacja między stronami lub przeładowanie. Zamiast tego, tutaj wykonywany jest niestandardowy proces – rejestrowanie wyjścia.
MouseEvent
MouseEvent reprezentuje zdarzenia związane z operacjami myszy. Zdarzenia myszy, takie jak click i mousemove, korzystają z tej klasy.
Przykład kodu
1const div = document.getElementById('clickArea');
2if (div) {
3 div.addEventListener('click', (event: MouseEvent) => {
4 console.log(`Clicked at: (${event.clientX}, ${event.clientY})`);
5 });
6}- Ten kod jest przykładem użycia
MouseEventdo wypisywania współrzędnych myszy.
Główne właściwości
clientXto współrzędna X wskaźnika myszy na stronie.clientYto współrzędna Y wskaźnika myszy na stronie.buttonwskazuje, który przycisk myszy został naciśnięty.0to lewy przycisk,1to środkowy przycisk, a2to prawy przycisk myszy.
KeyboardEvent
KeyboardEvent reprezentuje zdarzenia związane z operacjami klawiatury. Zdarzenia keydown i keyup należą do tej kategorii.
Przykład kodu
1document.addEventListener('keydown', (event: KeyboardEvent) => {
2 // Show the key name (e.g., "Enter", "a")
3 console.log(`Key pressed: ${event.key}`);
4
5 // Show the physical key code (e.g., "Enter", "KeyA")
6 console.log(`Key code: ${event.code}`);
7
8 // Check if Alt/Ctrl/Shift key was pressed
9 console.log(`Alt pressed: ${event.altKey}`);
10 console.log(`Ctrl pressed: ${event.ctrlKey}`);
11 console.log(`Shift pressed: ${event.shiftKey}`);
12
13 if (event.key === 'Enter') {
14 console.log('Enter was pressed');
15 }
16});Główne właściwości
keyto nazwa naciśniętego klawisza, np.Enterluba.codeto kod odpowiadający klawiszowi na klawiaturze.altKey,ctrlKeyishiftKeyto właściwości wskazujące, czy został naciśnięty klawiszAlt,CtrllubShift.
Wyjaśnienie kodu
- Ten kod używa
KeyboardEvent, aby zapisać nazwę naciśniętego klawisza (key), odpowiadający mu kod (code) oraz informację, czy naciśnięto klawisze modyfikujące (altKey,ctrlKey,shiftKey). Wykonywana jest również specjalna akcja po naciśnięciu klawiszaEnter.
FocusEvent
FocusEvent odnosi się do zdarzeń związanych z uzyskaniem lub utratą fokusu. Zdarzenia focus i blur należą do tej kategorii.
Przykład kodu
1const inputElement = document.getElementById('myInput');
2if (inputElement) {
3 inputElement.addEventListener('focus', (event: FocusEvent) => {
4 console.log('Input focused');
5 });
6
7 inputElement.addEventListener('blur', (event: FocusEvent) => {
8 console.log('Input lost focus');
9 });
10}- Ten kod jest przykładem użycia
FocusEventdo wykrywania i wypisywania, gdy pole input otrzymuje lub traci fokus.
Pisanie w TypeScript
Podczas korzystania z TypeScript ulepszone jest sprawdzanie typów podczas manipulacji DOM i obsługi zdarzeń. Poniżej znajdują się przykłady manipulacji DOM i obsługi zdarzeń z uwzględnieniem typów w TypeScript.
Nasłuchiwanie zdarzeń z uwzględnieniem typów
Podczas dodawania nasłuchiwania zdarzeń określanie typu zdarzenia umożliwia sprawdzanie typów i zapobiega dostępowi do niepoprawnych właściwości.
1const input = document.querySelector<HTMLInputElement>('#myInput');
2// Event listener with explicit type annotation for safety
3input?.addEventListener('input', (event: Event) => {
4 // event.target is EventTarget, so it needs to be cast to the correct type
5 const target = event.target as HTMLInputElement;
6 console.log(`Current value: ${target.value}`);
7});- Ten kod jest przykładem zastosowania typowanego nasłuchiwacza zdarzeń do obsługi zdarzeń input i bezpiecznego pobierania oraz wypisywania aktualnej wartości pola input.
Obsługa zdarzeń z zastosowaniem generyków
Używając generyków w TypeScript, można realizować ogólną obsługę zdarzeń wspierającą różne typy zdarzeń.
1// Generic event handler function
2function handleEvent<T extends Event>(event: T) {
3 console.log(`Event type: ${event.type}`);
4 if (event.target instanceof HTMLElement) {
5 console.log(`Target element: ${event.target.tagName}`);
6 }
7}
8
9const input = document.querySelector<HTMLInputElement>('#myInput');
10input?.addEventListener('input', handleEvent);- Ten kod jest przykładem generycznego obsługiwacza zdarzeń wykorzystującego generyki, który wypisuje typ zdarzenia oraz nazwę tagu elementu docelowego.
Podsumowanie
W TypeScript typy są stosowane do standardowych API DOM podczas manipulacji DOM i obsługi zdarzeń, co poprawia bezpieczeństwo i czytelność kodu. Wykorzystując klasy takie jak Document i Element oraz klasy związane ze zdarzeniami, takie jak Event, MouseEvent i KeyboardEvent, możliwe jest tworzenie bezpiecznego typowo kodu. Dodatkowo używanie querySelector<T>() lub HTMLCollectionOf<T> pozwala na bezpieczne typowo manipulacje DOM.
Możesz śledzić ten artykuł, korzystając z Visual Studio Code na naszym kanale YouTube. Proszę również sprawdzić nasz kanał YouTube.