TypeScriptにおけるDOM操作/イベント処理に用いられるクラス
この記事ではTypeScriptにおけるDOM操作/イベント処理に用いられるクラスについて説明します。
Document
クラス、Element
やNodeList
クラス、各種イベント関連のクラスをコードを通して学べます。
YouTube Video
TypeScriptにおけるDOM操作/イベント処理に用いられるクラス
TypeScriptにおけるDOM操作やイベント処理に関しては、主に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要素を作成します。
コード解説
- このコードは、
getElementById
を使ってid
属性を持つ要素を取得し、テキストを書き換えています。また、querySelector
でボタン要素を取得し、クリックイベントを追加しています。クリック時には、createElement
で新しいdiv
要素を作成して本文に追加する処理も行っています。ジェネリクスや型アサーションを活用して、DOM操作における型安全を確保しています。
Element
Element
は、DOMの個々のHTML要素を表すインターフェースです。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
メソッドは、要素に属性を設定します。
コード解説
- このコードは、
querySelector
で取得した要素に対して、innerHTML
とtextContent
でコンテンツを設定し、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操作やイベント処理における型チェックが強化されます。以下は、TypeScriptの型安全なDOM操作やイベント処理の例です。
型付けされたイベントリスナー
イベントリスナーを追加する際に、イベントの型を指定することで型チェックが行われ、誤ったプロパティへのアクセスを防ぐことができます。
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では、DOM操作やイベント処理を行う際に、標準的なDOM APIに対して型が適用されるため、コードの安全性と可読性が向上します。Document
やElement
といったクラスや、Event
, MouseEvent
, KeyboardEvent
のようなイベントに関連するクラスを活用して、型安全な開発が可能になります。また、querySelector<T>()
や HTMLCollectionOf<T>
を使うと型安全なDOM操作が可能になります。
YouTubeチャンネルでは、Visual Studio Codeを用いて上記の記事を見ながら確認できます。 ぜひYouTubeチャンネルもご覧ください。