10
7

More than 3 years have passed since last update.

JavaScript: EventTargetでイベントを送受信する方法

Posted at

この投稿ではJavaScriptのEventTargetを使って、ブラウザ上でイベントを送信したり受信したりする方法を紹介します。

サーバサイドでNode.jsを使っていると、ビルトインライブラリにeventsがあり、EventEmitterクラスでイベントの送受信ができて便利ですが、これはNode.js固有のものなのでブラウザでは使えません。代わりに、クライアントサイドではEventTargetを使うことで、EventEmitterのようなことができます。

EventTargetは多くのブラウザが対応

EventTargetは、多くのブラウザが対応しており、特に外部ライブラリのインストールを必要としません。

CleanShot 2020-07-03 at 10.01.46@2x.png

EventTargetの基本的な使い方

まず、EventTargetnewします。

const events = new EventTarget()

イベントを受信するイベントリスナーの登録は、addEventListenerメソッドでします:

const fooListener = ({ type, detail }) => console.log({ type, detail })
events.addEventListener('foo', fooListener)

イベントリスナーの第一引数のオブジェクトにはいろいろな情報が入ってきますが、typeプロパティとdetailプロパティは重要です。typeプロパティにはイベント名が、detailプロパティには送信されたイベントのカスタムデータが入ってきます。

イベントを送信するには、dispatchEventメソッドを使います:

events.dispatchEvent(new CustomEvent('foo', { detail: 'message1' }))

dispatchEventの第一引数は、CustomEventです。CustomEventコンストラクタには第一引数にイベント名、第二引数のdetailプロパティに一緒に送りたいカスタムデータを入れます。上の例ではdetailに文字列を入れていますが、配列やオブジェクトでも大丈夫です。

以上の基本的な使い方を踏まえて、イベントの送受信をする簡単なサンプルコードが次です:

// EventTargetの作成
const events = new EventTarget()

// イベントリスナーの登録
const fooListener = ({ type, detail }) => console.log({ type, detail })
events.addEventListener('foo', fooListener)

// イベントの送信
events.dispatchEvent(new CustomEvent('foo', { detail: 'message1' }))
events.dispatchEvent(new CustomEvent('foo', { detail: 'message2' }))
events.dispatchEvent(new CustomEvent('foo', { detail: 'message3' }))

これを実行すると、3つのイベントが送信され、イベントリスナーはその3イベントを受信します。Chromeでの実行結果は次のようになります:

CleanShot 2020-07-03 at 10.12.22@2x.png

以上が、EventTargetの基本的な使い方です。

関連ページ

10
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
7