Классы, используемые для манипуляций с 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-канал.