Классы, используемые для манипуляций с DOM/обработки событий в TypeScript
В этой статье мы объясним, какие классы используются для манипуляций с DOM/обработки событий в TypeScript.
Вы можете узнать о классе Document, классах Element и NodeList, а также о различных классах, связанных с событиями, с помощью примеров кода.
YouTube Video
Классы, используемые для манипуляций с DOM/обработки событий в TypeScript
Для манипуляций с DOM и обработки событий в TypeScript в основном используются интерфейсы Document Object Model (DOM). При манипуляциях с DOM и обработке событий используются стандартные классы и интерфейсы JavaScript, но в TypeScript к ним добавляется информация о типах, что позволяет работать более безопасно.
Ниже описаны классы и интерфейсы, которые обычно используются для манипуляций с DOM и обработки событий.
Основные классы/интерфейсы, используемые для манипуляций с DOM
Document
Document — это объект, представляющий HTML- или XML-документы. Используется для доступа к дереву DOM или поиска элементов.
Пример кода
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});Основные методы
getElementByIdполучает элемент с указанным атрибутомid.querySelectorполучает элемент, используя CSS-селектор.createElementсоздает новый HTML-элемент.
Пояснение к коду
- Этот код получает элемент с атрибутом
idс помощьюgetElementByIdи изменяет его текст. Также он получает элемент кнопки с помощьюquerySelectorи добавляет обработчик события нажатия. При нажатии создаётся новый элементdivс помощьюcreateElementи добавляется в основной контент. Дженерики и утверждения типов используются для обеспечения типовой безопасности при работе с DOM.
Element
Element — это интерфейс, представляющий отдельные HTML-элементы в DOM. Наиболее часто используется при манипуляциях с DOM.
Пример кода
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}Основные свойства и методы
- Свойство
innerHTMLпозволяет устанавливать или получать HTML-содержимое элемента. - Свойство
textContentпозволяет устанавливать или получать текстовое содержимое элемента. classList— это свойство для управления классами, которое позволяет добавлять, удалять и переключать классы.- Метод
setAttributeустанавливает атрибут для элемента.
Пояснение к коду
- Этот код показывает пример установки содержимого с помощью
innerHTMLиtextContentдля элементов, полученных черезquerySelector, добавления классов с помощьюclassListи установки пользовательских атрибутов черезsetAttribute. Операции выполняются типобезопасным способом с использованием дженериков.
NodeList и HTMLCollection
NodeList и HTMLCollection представляют собой коллекции, содержащие несколько элементов DOM. Например, querySelectorAll возвращает NodeList, а getElementsByClassName возвращает HTMLCollection.
Пример кода
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});- Этот код демонстрирует прямую обработку
NodeListс помощьюforEach, а также преобразованиеHTMLCollectionв массив для перебора.
Основные классы/интерфейсы, используемые для обработки событий
Event
Event — это базовый класс для всех событий, происходящих в DOM. Различные события, такие как клики, ввод данных и загрузка страницы, расширяют класс Event.
Пример кода
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});Основные свойства и методы
- Свойство
targetпредставляет элемент (EventTarget), на котором произошло событие. typeобозначает тип произошедшего события, например,clickилиinput.- Метод
preventDefaultотменяет действие события по умолчанию.
Пояснение к коду
- Этот код демонстрирует, как добавить обработчик события
submitдля формы.targetссылается на элемент формы, в котором произошло событие, аtypeуказывает тип события (в данном случае,"submit"). Вызвав методpreventDefault, можно отключить стандартное поведение отправки формы, такое как переход по странице или её перезагрузка. Вместо этого здесь выполняется пользовательский процесс — вывод логов.
MouseEvent
MouseEvent представляет события, связанные с действиями мыши. Класс используется для событий мыши, таких как click и mousemove.
Пример кода
1const div = document.getElementById('clickArea');
2if (div) {
3 div.addEventListener('click', (event: MouseEvent) => {
4 console.log(`Clicked at: (${event.clientX}, ${event.clientY})`);
5 });
6}- Этот код — пример использования
MouseEventдля вывода координат мыши в лог.
Основные свойства
clientX— это координата X указателя мыши на странице.clientY— это координата Y указателя мыши на странице.buttonуказывает, какая кнопка мыши была нажата.0— левая кнопка,1— средняя кнопка,2— правая кнопка.
KeyboardEvent
KeyboardEvent представляет события, связанные с действиями клавиатуры. События keydown и keyup относятся к этой категории.
Пример кода
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});Основные свойства
key— имя нажатой клавиши, например,Enterилиa.code— это код клавиши на клавиатуре.altKey,ctrlKeyиshiftKey— это свойства, указывающие, была ли нажата клавишаAlt,CtrlилиShift.
Пояснение к коду
- Этот код использует
KeyboardEventдля вывода в лог имени нажатой клавиши (key), её кода (code) и информации о нажатии клавиш-модификаторов (altKey,ctrlKey,shiftKey). Также выполняется отдельное действие при нажатии клавишиEnter.
FocusEvent
FocusEvent относится к событиям получения или утраты фокуса. События focus и blur относятся к этой категории.
Пример кода
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}- Этот код — пример использования
FocusEventдля обнаружения и вывода в лог событий получения и потери фокуса полем ввода.
Типизация в TypeScript
При использовании TypeScript проверка типов при работе с DOM и обработке событий усиливается. Ниже приведены примеры безопасной с точки зрения типов работы с DOM и обработки событий в TypeScript.
Слушатели событий с типизацией
При добавлении слушателей событий указание типа события обеспечивает проверку типов и предотвращает доступ к некорректным свойствам.
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});- Этот код — пример использования типизированного обработчика событий для обработки событий ввода и безопасного получения и вывода в лог текущего значения поля ввода.
Универсальная обработка событий
Используя обобщенные типы в TypeScript, можно реализовать универсальную обработку событий, поддерживающую различные типы событий.
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);- Этот код — пример обобщенного обработчика событий с использованием обобщений, который выводит в лог тип события и имя тега целевого элемента.
Резюме
В TypeScript типы применяются к стандартным API DOM при работе с DOM и обработке событий, улучшая безопасность и читаемость кода. Используя такие классы, как Document и Element, а также классы, связанные с событиями, такие как Event, MouseEvent и KeyboardEvent, возможно безопасное с точки зрения типов развитие. Кроме того, использование querySelector<T>() или HTMLCollectionOf<T> позволяет безопасно работать с DOM с учетом типов.
Вы можете следовать этой статье, используя Visual Studio Code на нашем YouTube-канале. Пожалуйста, также посмотрите наш YouTube-канал.