The JavaScript dispatchEvent() method fires an event on an EventTarget, letting you trigger custom or built-in event flows (capture/bubble) in a controlled way for UI, components, and tests.
dispatchEvent は「イベントを自分で発火させる」ためのAPIで、伝播(キャプチャ/バブル)と preventDefault() の結果まで含めて制御できます。
dispatchEvent が「何を起こす/何を起こさない」か(既定動作・クリック等との違い)を説明できるCustomEvent でデータを渡し、コンポーネント間の通知を組み立てられるbubbles / cancelable / composed の意味と採用判断ができるtrue/false)と preventDefault() の関係をデバッグできるEventTarget、イベント伝播、イベントキューの言葉に接続して整理できるdispatchEvent って何?ざっくり言うと、dispatchEvent は「ユーザーが操作した“ことにする”」ではなく、「イベントという通知をDOMに流す」ためのスイッチです。
addEventListener)が呼ばれるbubbles: true なら親にも届くdispatchEvent は、EventTarget(DOM要素、document、window など)に対してイベントを発火し、登録済みのイベントリスナーを呼び出すためのメソッドです。
dispatchEvent は EventTarget を実装するオブジェクトで使えます。典型例は要素(HTMLElement)ですが、document や window、AbortSignal などにもイベント設計の考え方が流用できます。
Event / CustomEvent を発火し、リスナーを順番(キャプチャ→ターゲット→バブル)で実行するcancelable: true のイベントなら preventDefault() によるキャンセルを反映し、戻り値で結果を受け取れるbubbles: true で親要素へ伝播させ、コンポーネント間の通知に使えるevent.isTrusted は基本 false)dispatchEvent 自体はレイアウトを直接変更しませんが、リスナー内でDOM変更をすれば再計算が起きます(実務では「イベント→DOM更新→再描画」の流れで理解します)。isTrusted の違いがあり、セキュリティ上の制約が残ります。操作の代用ではなく、通知の設計として使います。aria-* 等)もセットで確認します。JavaScript
const target = document.querySelector("#target");
target.addEventListener("ping", (e) => {
console.log("ping!", e.detail);
});
const ev = new CustomEvent("ping", {
detail: { from: "dispatchEvent" },
bubbles: true
});
target.dispatchEvent(ev);
まずは「CustomEvent を作る → dispatchEvent で流す」を覚えるのが最短です。
{ bubbles: true }(親要素にバブルする){ cancelable: true }(リスナーで preventDefault() を許可){ composed: true }(影DOM境界を越えられる。設計判断が必要)new CustomEvent("name", { detail: ... })dispatchEvent(event) は キャンセルされなかったら true、キャンセルされたら false を返します。キャンセル判定は「cancelable: true のイベントで preventDefault() が呼ばれたか」で決まります。bubbles が false だと?cancelable が false だと?preventDefault() を呼んでも defaultPrevented が立たず、戻り値も変わりません。「止めたつもり」が事故になります。composed はいつ要る?composed: true にし、むやみに公開範囲を広げないのが安全です。isTrusted は?dispatchEvent で作ったイベントは多くの場合 isTrusted: false です。権限が絡む機能(ポップアップ、クリップボード等)はユーザー操作が必須のことがあり、テストと本番を混同しないようにします。Event を使い回せる?dispatchEvent = ユーザー操作の再現dispatchEvent は「イベント通知」を流すだけです。preventDefault() = 親への伝播を止めるstopPropagation() です。preventDefault() は「既定動作のキャンセル」です(ただし cancelable が必要)。bubbles: true なら必ず親で受けられるCustomEvent で detail に値を載せ、親側が購読する形にします(依存を減らして再利用しやすい)。JavaScript
function emitChange(el, value) {
el.dispatchEvent(new CustomEvent("widget:change", {
detail: { value },
bubbles: true
}));
}
dispatchEvent はユニット側で使われがちです。bubbles が false になっていないかtrue)前提になっていないかpreventDefault() したのに止まらないcancelable: true か(event.cancelable を確認)addEventListener していないか(初期化の重複)detail の形・公開範囲(bubbles/composed)をルール化し、コンポーネントが勝手に増えないようにします。aria-expanded、aria-pressed など)prefers-reduced-motion を尊重するaddEventListener{ capture: true })でキャプチャを切り替える。CustomEventdetail でデータを渡せる。アプリ独自の通知に向く。stopPropagation / stopImmediatePropagationpreventDefaultcancelable が必要)。dispatchEvent は“今その場で”通知を流すので、非同期の前提と混ぜるとバグが出ます。preventDefault() が効く(cancelable: true)isTrusted が true になり得るdispatchEvent の戻り値が false になる条件は?cancelable: true のイベントで、どこかのリスナーが preventDefault() したときです。
bubbles です。false なら親へは届きません。
preventDefault() と stopPropagation() の違いは?preventDefault() は既定動作のキャンセル、stopPropagation() は親への伝播を止めます。
dispatchEvent で作ったイベントは多くの場合 isTrusted が false で、ブラウザが権限系操作を許可しないためです。
dispatchEvent(new Event("click")) と element.click() は同じですか?dispatchEvent はイベント通知を流すだけで、click() は要素のクリック挙動(仕様に基づく処理)を伴うことがあります。true / false になるのが分かりません。cancelable: true のときだけ「キャンセルされたか」を見ます。キャンセルされていなければ true、preventDefault() が実行されれば false です。bubbles が true か、親のリスナーの登録場所(キャプチャ/バブル)と要素ツリーが想定どおりかを確認します。isTrusted の違いや、レイアウト計算・フォーカス等の環境差で起きます。通知(dispatchEvent)とUI操作(E2E)を分けて検証します。bubbles: false / 要素がDOM外 / Shadow DOM境界。確認:ログで event.bubbles と event.composed を見る。preventDefault() が効かないcancelable: false / 既定動作が別経路。確認:event.cancelable と event.defaultPrevented を見る。isTrusted: false でブロック。確認:event.isTrusted とブラウザコンソールの警告。dispatchEvent を使うclick())やE2Eを検討するbubbles: true をまず確認するcancelable: true と preventDefault() のセットを確認するevent.bubbles/cancelable/defaultPrevented と Event Listener Breakpoints が近道