[23] [[イベント]]は、[DFN[[RUBYB[[[既定動作]]]@en[default action]]]]を持つことがあります。
[[既定動作]]は[[イベントリスナー]]の実行後に処理される動作です。
[[イベント]]が[DFN[[RUBYB[[[取り消し可能]]]@en[cancelable]]]]
([DFN[[CODE(DOMa)@en[[[cancelable]]]]]] [[IDL属性]]) なら、
[DFN[[RUBYB[[[取り消し]]]@en[cancel]]]]
([DFN[[CODE(DOMm)@en[[[preventDefault]]]]]] [[メソッド]])
することができます。

* 仕様書

[REFS[
- [12] [CITE@en-US[DOM Standard]] ([TIME[2015-01-14 18:37:27 +09:00]] 版) <https://dom.spec.whatwg.org/#canceled-flag>
- [40] [CITE@en[DOM Standard]] ([TIME[2016-02-12 01:13:05 +09:00]] 版) <https://dom.spec.whatwg.org/#in-passive-listener-flag>
- [6] [CITE@en-US[DOM Standard]] ([TIME[2015-01-14 18:37:27 +09:00]] 版) <https://dom.spec.whatwg.org/#dom-event-cancelable>
- [8] [CITE@en-US[DOM Standard]] ([TIME[2015-01-14 18:37:27 +09:00]] 版) <https://dom.spec.whatwg.org/#dom-event-preventdefault>
- [11] [CITE@en-US[DOM Standard]] ([TIME[2015-01-14 18:37:27 +09:00]] 版) <https://dom.spec.whatwg.org/#dom-event-defaultprevented>
- [13] [CITE@en-US[DOM Standard]] ([TIME[2015-01-14 18:37:27 +09:00]] 版) <https://dom.spec.whatwg.org/#concept-event-dispatch>
- [34] [CITE@en[DOM Standard]] ([TIME[2016-02-12 01:13:05 +09:00]] 版) <https://dom.spec.whatwg.org/#concept-event-listener>
- [36] [CITE@en[DOM Standard]] ([TIME[2016-02-12 01:13:05 +09:00]] 版) <https://dom.spec.whatwg.org/#dom-eventlisteneroptions-passive>
- [49] [CITE@en[DOM Standard]] ([TIME[2016-02-20 20:19:45 +09:00]] 版) <https://dom.spec.whatwg.org/#action-versus-occurance>
]REFS]

* 取り消し可能性

[7] [[イベントオブジェクト]]は、[[取り消し可能]]かどうかの状態を持ちます。
[CODE(DOMa)@en[[[cancelable]]]] [[IDL属性]]は、初期化時に与えられた値を返さなければ[['''なりません''']] [SRC[>>6]]。

;; 初期化後にこれを変更することはできません。

[24] [[利用者エージェント]]が[[発火]]する[[イベント]]については、
[[イベント型]]と文脈によって[[取り消し可能]]か否かが予め決められています。

* 取り消し

[10] [[イベントオブジェクト]]は、[DFN[[RUBYB[[[取り消し済みフラグ]]]@en[canceled flag]]]]なる状態を持ちます [SRC[>>12]]。
初期値は未設定です [SRC[>>12]]。 [DFN[[CODE(DOMa)@en[[[defaultPrevented]]]]]]
[[IDL属性]]は、[[取り消し済みフラグ]]が設定されているか否かを返さなければ[['''なりません''']]
[SRC[>>11]]。

[9] [[イベントオブジェクト]]の [DFN[[CODE(DOMm)@en[[[preventDefault]]]]]] [[メソッド]]は、
次のようにしなければ[['''なりません''']] [SRC[>>8]]。
[FIG(steps)[
= [62] [[文脈オブジェクト]]について、
[[取り消し済みフラグを設定]]します。
]FIG]

[44] [[イベントオブジェクト]]の 
[DFN[[CODE(DOMa)@en[returnValue]]]]
[[IDL属性]]の[[取得器]]は、
次のようにしなければ[MUST[なりません]] [SRC[>>11]]。

[FIG(steps)[
= [64] [[文脈オブジェクト]]の[F[取り消し済みフラグ]]の[[否定]]を返します。
]FIG]

[65] [[イベントオブジェクト]]の
[CODE(DOMa)@en[returnValue]]
[[IDL属性]]の[[設定器]]は、
[VAR[新しい値]]について、
次のようにしなければ[MUST[なりません]] [SRC[>>11]]。

[FIG(steps)[
= [67] [VAR[新しい値]]が[[偽]]の場合、
== [66] [[文脈オブジェクト]]について[[取り消し済みフラグを設定]]します。
]FIG]

-*-*-

[63] [VAR[イベント]]について[DFN[[RUBYB[取り消し済みフラグを設定]@en[set the canceled flag]]]]するには、
次のようにします。

[FIG(steps)[
= [42] [VAR[イベント]]の[F[取り消し可能]]が[[真]]で、
[VAR[イベント]]の[F[受動的リスナー内フラグ]]が[[偽]]の場合、
== [43] [VAR[イベント]]の[F[取り消し済みフラグ]]を、[[真]]に設定します。
= [47] それ以外の場合、
== [48] [[開発者コンソール]]に報告することが[RUBYB[推奨]@en[encourage]]されています。
]FIG]

[15] [[イベントハンドラー]]が[[偽]]を返した時も、
[[取り消し済みフラグ]]が設定されます。

;; [[イベントハンドラー]]を参照。

[14] [[イベント]]の [[dispatch]] は、[[イベントリスナー]]を実行し終えたら、
[[イベント]]の[[取り消し済みフラグ]]が設定されていれば[[偽]]、
設定されていなければ[[真]]を返さなければ[['''なりません''']] [SRC[>>13]]。
つまり、 [[dispatch]] は取り消されなかったかどうかを返します。

* 受動的フラグ

[35] [[イベントリスナー]]は、[F[[DFN[[RUBYB[受動的]@en[passive]]]]]]フラグを持ちます
[SRC[>>34]]。このフラグは、 [CODE(DOMm)@en[[[preventDefault]]]]
が効力を持つかどうかを表します。

[37] [CODE(DOMi)@en[AddEventListenerOptions]] の [DFN[[CODE(DOM)@en[[[passive]]]]]]
は、[[イベントリスナー]]の[F[[[受動的]]]]フラグの値を
[CODE(IDL)@en[[[boolean]]]] で指定します [SRC[>>36]]。
[CODE(DOMm)@en[[[addEventListener]]]] では追加する[[イベントリスナー]]の[F[受動的]]フラグを設定するか否かを指定します。
この値が明示されなければ、[[イベントリスナー]]は[F[[[受動的]]]]では''ない''とされます。

;; [39] [CODE(DOMm)@en[removeEventListener]] では指定しても意味がありません。

;; [38] [[イベントハンドラー]]も、[[受動的]]ではありません。

[41] [[イベント]]は、[F[[DFN[[RUBYB[受動的イベント内フラグ]@en[in passive listener flag]]]]]]を持ちます
[SRC[>>40]]。このフラグは初期状態では未設定ですが、[F[[[受動的]]]]な[[イベントリスナー]]の[F[[[コールバック]]]]の実行中のみ、
設定されます。

[45] このフラグは [CODE(DOMm)@en[[[preventDefault]]]] [[メソッド]]で参照されます (>>44)。

[46] [F[[[受動的]]]]フラグは、[[利用者エージェント]]の処理を最適化できるようにするために導入されました。
例えば [[Touch Events]] の処理は[[スクロール]]のパフォーマンスに影響します。
[[イベント]]を[[取消]]すると[[スクロール]]を抑制できるので、
[[イベントリスナー]]が登録されているとその結果を待たないと[[スクロール]]処理を実行できませんが、
実際ほとんどの[[イベントリスナー]]は[[取消]]しないので、
待つだけ無駄です [SRC[>>32]]。本フラグにより[[著者]]は[[利用者エージェント]]に[[ヒント]]を与えることができます。

;; [50] [[イベントリスナー]]も参照。

* 既定動作

[16] [DFN[[RUBYB[既定動作]@en[default action]]]]は、[[イベント]]の処理直後に実行される処理です。

[20] [[既定動作]]の多くは、[[イベント]]が[[取り消し]]された場合には実行されません。
[[既定動作]]が規定されている[[イベント]]の多くは、[[取り消し可能]]です。

[19] この用語は [[W3C DOM]] 時代にはありましたが [SRC[>>17, >>18]]、現在の [[DOM Standard]]
では定義されていません。
90年代末から00年代前半には、どのようなきっかけであろうと[[イベント]]が[[発火]]されると、
その結果として何らかの動作が発生する、
という解釈が存在していました。例えば[[クリック]]時の動作を起こしたければ、
実際に[[クリック]]せずとも、 [CODE(DOMe)@en[[[click]]]] [[イベント]]を[[発火]]することで代用させることができる実装や状況も存在していました。
00年代中頃からは、そうした解釈は誤り [SRC[>>49]] とする考え方が主流となり、
きっかけとなる出来事ごとの動作が明確を明確に規定し、
[[イベント]]の[[発火]]はその途中の一段階に過ぎないものと扱うようになりました。
この現代的解釈のもとでは[[イベント]]の結果生じた動作ではなく、
一連の動作の続きの段階ですから、''[[イベント]]の''[[既定動作]]と説明するのは不正確になります。
(また [CODE(DOMe)@en[[[click]]]] [[イベント]]を[[発火]]したからといって、
[[クリック]]相当の動作が発生するわけではありません。)

[22] ただし [[HTML Standard]] など [[DOM Standard]] 以前から存在する仕様書には、
まだ[[既定動作]]という用語が残っています。そのような[[既定動作]]は、
[[イベント]]の [[dispatch]] の後に[[イベント]]が[[取り消し]]されていなければ、
同じ[[タスク]]で引き続き実行することが求められているようです。

[21] [[既定動作]]は色々な[[イベント]]に対して存在していますが、特に象徴的なのは
[CODE(DOMe)@en[[[click]]]] [[イベント]]の[[既定動作]]といえる[[活性化動作]]でしょう。
例えば [CODE(HTMLe)@en[[[a]]]] [[要素]]の[[ハイパーリンク]]が[[クリック]]され、
その [CODE(DOMe)@en[[[click]]]] [[イベント]]が[[取り消し]]されなければ、
その[[ハイパーリンク]]を辿ることになります。
もっとも現在[[活性化動作]]は[[既定動作]]としてではなく、専用の[[アルゴリズム]]によって動作が規定されており、それは >>22 よりも複雑なものとなっています。

* 歴史

[5] [CITE[Bug 127903 &#8211; <a> link tags intercept events meant for form submit buttons]] ([TIME[2007-02-17 21:54:24 +09:00]] 版) <https://bugzilla.mozilla.org/show_bug.cgi?id=127903>
([[名無しさん]] [WEAK[2007-02-17 13:00:51 +00:00]])

[4] [CITE@en[WICD Core 1.0]]
( ([TIME[2010-08-17 16:51:00 +09:00]] 版))
<http://www.w3.org/TR/WICD/#hyperlinking>

[1]
[CITE[Safari の event.stopPropagation() や event.preventDefault() がウソ実装のままである件 ]] <http://www.remus.dti.ne.jp/~a-satomi/nikki/2005/06a.html#d27n03>
([[名無しさん]] [sage] [WEAK[2005-06-26 23:06:31 +00:00]])

[2]
[[WinIE7]] は [CODE(DOMm)@en[[[preventDefault]]]] を実装していません。
代わりに [CODE(DOMa)@en[[[returnValue]]]] があります。

[3] [CITE[XML Events 2]]
( ([TIME[2010-12-18 05:25:20 +09:00]] 版))
<http://www.w3.org/TR/xml-events2/#section-preventDefault-element>

[REFS[
- [17] [CITE@en-US[Document Object Model (DOM) Level 3 Events Specification]] ([TIME[2015-02-08 23:16:57 +09:00]] 版) <https://dvcs.w3.org/hg/dom3events/raw-file/tip/html/DOM3-Events.html#glossary-default-action>
- [18] [CITE@en-US[Document Object Model (DOM) Level 3 Events Specification]] ([TIME[2015-02-08 23:17:32 +09:00]] 版) <https://dvcs.w3.org/hg/dom3events/raw-file/tip/html/DOM3-Events.html#event-flow-default-cancel>
]REFS]

[25] [CITE@en[Explain in many different ways that events cannot cause actions. Fixe… · whatwg/dom@24ab873]]
([TIME[2015-08-04 14:00:45 +09:00]] 版)
<https://github.com/whatwg/dom/commit/24ab873d17669b5c1994a3dd92a27d29b1dd03e4>

[26] [CITE@en[12230 – Some synthetic events cause actions]]
([TIME[2015-08-04 14:03:39 +09:00]] 版)
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=12230>

[27] [CITE@en[124990 – Event ordering rewrite tracking bug]]
([TIME[2015-08-04 14:18:56 +09:00]] 版)
<https://bugzilla.mozilla.org/show_bug.cgi?id=124990>

** イベント群

[54] [CITE@en-US[Document Object Model Events]]
([TIME[2003-11-06 11:10:02 +09:00]] 版)
<http://www.w3.org/TR/2003/NOTE-DOM-Level-3-Events-20031107/events.html#Event-groups>

[FIG(quote)[
[FIGCAPTION[
[28] [CITE@en[12230 – Some synthetic events cause actions]]
([TIME[2015-08-04 14:19:17 +09:00]] 版)
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=12230#c57>
]FIGCAPTION]

> System event group was added to Gecko 2002
> https://bugzilla.mozilla.org/show_bug.cgi?id=124990#c0
> (Though, before firefox 3, Gecko's event dispatching was really odd, but the
system group certainly was there.)

]FIG]


[FIG(quote)[
[FIGCAPTION[
[29] [CITE@en[12230 – Some synthetic events cause actions]]
([TIME[2015-08-04 14:23:25 +09:00]] 版)
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=12230#c60>
]FIGCAPTION]

> (Gecko never has had more than default and system groups, so it implemented a variant of what the old D3E draft had.)

]FIG]


[30] [CITE@en[12230 – Some synthetic events cause actions]]
([TIME[2015-08-04 14:31:06 +09:00]] 版)
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=12230>

** 受動的オプション

;; [31] [CODE(DOMi)@en[[[EventListenerOptions]]]] も参照。

[REFS[
- [32] [CITE@en[EventListenerOptions/explainer.md at gh-pages · RByers/EventListenerOptions]] ([TIME[2016-02-14 23:26:18 +09:00]] 版) <https://github.com/RByers/EventListenerOptions/blob/gh-pages/explainer.md>
- [33] [CITE@en[Add EventListenerOptions and passive event listener feature · whatwg/dom@253a21b]] ([TIME[2016-02-14 23:26:30 +09:00]] 版) <https://github.com/whatwg/dom/commit/253a21b8e78e37447c47983916a7cf39c4f6a3c5>
]REFS]

[51] [CITE@en[Should the API be forwards compatible? · Issue #12 · WICG/EventListenerOptions]]
([TIME[2016-04-17 00:10:53 +09:00]] 版)
<https://github.com/WICG/EventListenerOptions/issues/12>

[52] [CITE@en[Touch Events - Level 2]]
([TIME[2016-03-19 04:36:15 +09:00]] 版)
<https://w3c.github.io/touch-events/#cancelability>

[53] [CITE@en[Remove passive as event listener key · whatwg/dom@a13a3c7]]
([TIME[2016-04-25 21:19:40 +09:00]] 版)
<https://github.com/whatwg/dom/commit/a13a3c7fc14732691b50c51316b16de0915a61f2>

[55] [CITE@en[Forced passive touch listeners · Issue #18 · WICG/interventions]]
([TIME[2016-07-12 01:16:49 +09:00]])
<https://github.com/WICG/interventions/issues/18>

[56] [CITE@en[Editorial: major cleanup around firing and dispatching events]]
([[annevk]]著, [TIME[2016-10-19 01:00:43 +09:00]])
<https://github.com/whatwg/html/commit/8ffbd146d4709057e45dd6cfc81e7a70897050c5>

[57] [CITE@en[Remove mentions of "default action". Fix #14]]
([[garykac]]著, [TIME[2016-12-21 04:37:52 +09:00]])
<https://github.com/w3c/clipboard-apis/commit/763deeaacc073057fae998a301bed0fdcd49e303>

[58] [CITE@en[Making touch scrolling fast by default  |  Web  |  Google Developers]]
([TIME[2017-01-19 00:59:21 +09:00]])
<https://developers.google.com/web/updates/2017/01/scrolling-intervention>

[59] [CITE@en[chrome, doesn't accept preventDefault and still cancelable is true · Issue #579 · whatwg/dom]]
([TIME[2018-03-12 15:16:50 +09:00]])
<https://github.com/whatwg/dom/issues/579>

[60] [CITE@en[chrome, doesn't accept preventDefault and still cancelable is true · Issue #63 · WICG/interventions]]
([TIME[2018-03-12 15:17:45 +09:00]])
<https://github.com/WICG/interventions/issues/63>

[61] [CITE@en[Define Event's srcElement and returnValue]]
([[miketaylr]]著, [TIME[2018-03-31 05:49:42 +09:00]])
<https://github.com/whatwg/dom/commit/e36b369a418663603e081d211dc844d197d97ecb>

[68] [CITE@en[Define Event's srcElement and returnValue]]
([[miketaylr]]著, [TIME[2018-03-31 05:49:42 +09:00]])
<https://github.com/whatwg/dom/commit/e36b369a418663603e081d211dc844d197d97ecb>

[69] [CITE@en[Define Event.srcElement and Event.returnValue · Issue #625 · whatwg/dom]]
([TIME[2018-04-10 22:46:39 +09:00]])
<https://github.com/whatwg/dom/issues/625>

[70] [CITE@en[Flag refs in preventDefault()'s description missing "context object’s" qualifier · Issue #627 · whatwg/dom]]
([TIME[2018-04-10 22:46:49 +09:00]])
<https://github.com/whatwg/dom/issues/627>

[71] [CITE@en[Define Event.srcElement and Event.returnValue by miketaylr · Pull Request #626 · whatwg/dom]]
([TIME[2018-04-10 22:47:04 +09:00]])
<https://github.com/whatwg/dom/pull/626>

[72] [CITE[New WebKit Features in Safari 11.1 | WebKit]]
([TIME[2018-04-13 13:40:37 +09:00]])
<https://webkit.org/blog/8216/new-webkit-features-in-safari-11-1/>

[73] [CITE[New WebKit Features in Safari 11.1 | WebKit]]
([TIME[2018-04-24 13:07:45 +09:00]])
<https://webkit.org/blog/8216/new-webkit-features-in-safari-11-1/>

[74] [CITE@en[Merge pull request #150 from w3c/tdresser-no-default-action]]
([[yoavweiss]]著, [TIME[2018-05-16 16:08:47 +09:00]])
<https://github.com/w3c/resource-timing/commit/0b6e7991107bcb5e17a98873f6a0ad160da073d1>

[75] [CITE@en[Remove mention of default actions. by tdresser · Pull Request #150 · w3c/resource-timing]]
([TIME[2018-05-18 15:21:56 +09:00]])
<https://github.com/w3c/resource-timing/pull/150>

[76] [CITE@en[Events don't have default actions · Issue #148 · w3c/resource-timing]]
([TIME[2018-05-18 15:22:11 +09:00]])
<https://github.com/w3c/resource-timing/issues/148>

[77] [CITE@en[Merge pull request #150 from w3c/tdresser-no-default-action]]
([[yoavweiss]]著, [TIME[2018-05-16 16:08:47 +09:00]])
<https://github.com/w3c/resource-timing/commit/0b6e7991107bcb5e17a98873f6a0ad160da073d1>

[78] [CITE@en[Remove mention of default actions. by tdresser · Pull Request #150 · w3c/resource-timing]]
([TIME[2019-02-18 13:30:49 +09:00]])
<https://github.com/w3c/resource-timing/pull/150>