TypeScriptにおけるDOM操作/イベント処理に用いられるクラス

TypeScriptにおけるDOM操作/イベント処理に用いられるクラス

この記事ではTypeScriptにおけるDOM操作/イベント処理に用いられるクラスについて説明します。

Documentクラス、ElementNodeListクラス、各種イベント関連のクラスをコードを通して学べます。

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で取得した要素に対して、innerHTMLtextContentでコンテンツを設定し、classListを使ってクラスを追加し、setAttributeでカスタム属性を設定する例です。ジェネリクスを利用して型安全に操作を行っています。

NodeListHTMLCollection

NodeListHTMLCollectionは、複数のDOM要素を含むコレクションを表します。例えば、querySelectorAllNodeListを返し、getElementsByClassNameHTMLCollectionを返します。

コード例
 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});
  • このコードは、NodeListforEachで直接操作し、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は、clickinputなど、発生したイベントのタイプを表します。
  • preventDefaultメソッドは、イベントのデフォルト動作を無効にします。
コード解説
  • このコードは、フォームに対して submit イベントリスナーを追加する例です。target はイベントが発生したフォーム要素を表し、type はイベントの種類(ここでは "submit")を示します。preventDefault メソッドを呼び出すことで、ページ遷移やリロードといったフォーム送信のデフォルト動作を無効にできます。ここでは、代わりにカスタム処理であるログ出力を実行しています。

MouseEvent

MouseEventは、マウス操作に関連するイベントを表します。clickmousemoveなどのマウスイベントはこのクラスを利用します。

コード例
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は、キーボード操作に関連するイベントを表します。keydownkeyupイベントがこれに該当します。

コード例
 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は、Enteraなどの押されたキーの名前です。
  • codeは、キーボード上のキーに対応するコードです。
  • altKey, ctrlKey, shiftKeyは、AltキーやCtrlキー、Shiftキーが押されていたかどうかを示すプロパティです。
コード解説
  • このコードは、KeyboardEventを使って押されたキーの名前(key)、対応するキーコード(code)、さらに修飾キー(altKeyctrlKeyshiftKey)が押されていたかどうかをログ出力し、Enterキーが押された場合に特別な処理を行っています。

FocusEvent

FocusEventは、フォーカスの取得や喪失に関連するイベントです。focusblurイベントがこれに該当します。

コード例
 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に対して型が適用されるため、コードの安全性と可読性が向上します。DocumentElementといったクラスや、Event, MouseEvent, KeyboardEventのようなイベントに関連するクラスを活用して、型安全な開発が可能になります。また、querySelector<T>()HTMLCollectionOf<T> を使うと型安全なDOM操作が可能になります。

YouTubeチャンネルでは、Visual Studio Codeを用いて上記の記事を見ながら確認できます。 ぜひYouTubeチャンネルもご覧ください。

YouTube Video