Event コンストラクタは「既存イベントを自分の手で発火させるための素のイベント」
Event コンストラクタは、
「クリックや変更など、既に名前が決まっているイベントを、自分の手で“発生させたことにする”ための一番シンプルなイベントオブジェクト」 を作る道具です。
click や change などは、本来ブラウザが自動で発火します。
でも、「コードからも同じイベントを起こしたい」ことがあります。
ボタンのクリック処理をテストしたい
フォームの change イベントを手動で起こしたい
ある処理の最後に「更新されたよ」というイベントを飛ばしたい
こういうときに、new Event("click") のようにしてイベントを作り、dispatchEvent で発火させます。
CustomEvent が「アプリ独自のイベント」を作るためのものだとしたら、Event は「既存のイベント名を使う、素のイベント」を作るためのもの、というイメージです。
一番基本:Event で click を自分で発火させてみる
click イベントをコードから起こす
HTML を想像します。
<button id="btn">押してね</button>
JavaScript はこうです。
const btn = document.querySelector("#btn");
btn.addEventListener("click", () => {
console.log("クリックされました!");
});
// ここで「自分でクリックイベントを発火」
const ev = new Event("click");
btn.dispatchEvent(ev);
JavaScript流れを言葉で整理するとこうなります。
addEventListener("click", ...)でクリック時の処理を書くnew Event("click")で「click イベントオブジェクト」を作るbtn.dispatchEvent(ev)で「このボタンで click が起きたことにする」
これで、ユーザーが実際にクリックしなくても、
「クリックされたときの処理」が実行されます。
ここで掴んでほしいのは、
「イベントリスナーは“誰が発火したか”を気にしない」
「ブラウザが発火しても、自分で発火しても、同じように動く」
という感覚です。
Event コンストラクタの形とオプション
new Event(type, options) の基本
Event コンストラクタはこういう形です。
const ev = new Event("change", {
bubbles: true,
cancelable: true
});
JavaScripttype はイベント名("click", "change", "input" など)options はイベントの性質を決めるオブジェクトです。
よく使うのは次の 2 つです。
bubbles
イベントが親要素に伝わるかどうか(バブリングするか)
cancelableevent.preventDefault() でキャンセルできるかどうか
例えば、change イベントをフォーム要素で使うときは、bubbles: true にしておくと、親要素でも拾いやすくなります。
const ev = new Event("change", { bubbles: true });
input.dispatchEvent(ev);
JavaScript例題:input の値を書き換えてから change イベントを発火する
HTML
<input id="name" type="text">
JavaScript
const input = document.querySelector("#name");
input.addEventListener("change", (event) => {
console.log("change 発火。現在の値:", event.target.value);
});
// 値を書き換える
input.value = "太郎";
// change イベントを自分で発火
const ev = new Event("change", { bubbles: true });
input.dispatchEvent(ev);
JavaScriptここで起きていることはこうです。
inputにchangeリスナーを付ける- JavaScript から
input.valueを書き換える new Event("change")で change イベントを作るdispatchEventで「change が起きたことにする」
これで、ユーザーがフォーカスを外さなくても、change イベントの処理が実行されます。
「値を変えたら change が起きる」という前提で書かれたコードを、
自分の手でトリガーできるわけです。
Event と CustomEvent の違いを整理する
Event は「型だけ」、CustomEvent は「データ付き」
Event は、基本的に「イベントの種類(type)と性質(bubbles, cancelable)」だけを持つ、
とてもシンプルなイベントです。
一方で CustomEvent は、detail というプロパティに好きなデータを乗せられます。
const ev1 = new Event("update");
const ev2 = new CustomEvent("update", {
detail: { count: 10 }
});
JavaScript受け取る側では、
Event なら event.type くらいしか見るものがないCustomEvent なら event.detail からデータを取り出せる
という違いがあります。
「ただ“起きたこと”だけ伝えたい」なら Event
「一緒にデータも渡したい」なら CustomEvent
という使い分けが基本です。
既存のイベント名を使うなら Event が自然
例えば、
"click""change""input""submit"
など、既に意味が決まっているイベント名を使うときは、Event を使うのが自然です。
一方で、
"cart:add""user:login""score:changed"
のようなアプリ独自のイベント名を使うときは、CustomEvent で detail にデータを乗せるほうが便利です。
例題:フォーム送信後に「submit 後イベント」を自分で発火する
HTML
<form id="form">
<input name="q" type="text">
<button type="submit">送信</button>
</form>
JavaScript
const form = document.querySelector("#form");
// submit 時の処理
form.addEventListener("submit", (event) => {
event.preventDefault();
console.log("フォームが送信されました");
// ここで「送信後イベント」を発火
const ev = new Event("after:submit");
form.dispatchEvent(ev);
});
// 送信後イベントの処理
form.addEventListener("after:submit", () => {
console.log("送信後の処理を実行します");
});
JavaScriptここでは、あえて CustomEvent ではなく Event を使っています。
理由は、「特にデータを渡す必要がないから」です。
"after:submit" という名前のイベントを、
Event で作るdispatchEvent で発火するaddEventListener で受け取る
という流れで、「処理の区切り」をイベントとして表現しています。
こうすると、
「送信時の処理」と
「送信後の処理」を
きれいに分けて書けるようになります。
重要ポイント:Event で「テストしやすいコード」にする感覚
イベントリスナーを「テスト対象」にできる
例えば、ボタンのクリックで何か処理をするコードがあるとします。
btn.addEventListener("click", () => {
doSomething();
});
JavaScriptこのとき、doSomething が正しく呼ばれるかをテストしたいなら、Event で click を自分で発火させればいいわけです。
const ev = new Event("click");
btn.dispatchEvent(ev);
JavaScriptこれで、「ユーザーがクリックしたとき」と同じ経路で処理が走ります。
「イベントをコードからも発火できる」ということは、
「イベントリスナーをテストしやすい」ということでもある
と捉えておくと、設計の視点が一段上がります。
「物理イベント」と「論理イベント」を分ける
もう一歩踏み込むと、
物理イベント(ユーザーのクリック・入力など)
論理イベント(アプリの状態変化:更新された、追加された、削除された など)
を分けて考えると、コードが整理されます。
物理イベント → DOM の click, input, change など
論理イベント → Event / CustomEvent で自分で発火する
という構造にすると、
「ユーザー操作」と「アプリの出来事」が頭の中で整理され、
イベント駆動の設計がしやすくなります。
初心者として Event コンストラクタで本当に掴んでほしいこと
Event コンストラクタは「既存イベント名で、素のイベントオブジェクトを作る」ためのものnew Event(type, { bubbles, cancelable }) でイベントを作り、dispatchEvent で発火する
クリックや change などを「コードからも起こしたことにできる」
データを渡したいときは CustomEvent の detail を使う
イベントを自分で発火できると、「テストしやすい」「論理イベントを設計しやすい」コードになる
まずは、
ボタンに click リスナーを書いてから、new Event("click") → dispatchEvent で自分で発火してみてください。
「ユーザーの操作」と「イベントオブジェクト」が頭の中でつながると、
Event コンストラクタはただの API ではなく、
「アプリの動きをイベントとして再現・設計するためのスイッチ」 に見えてきます。
