[34] [[DOM]] の[DFN[[RUBYB[[[イベントハンドラー]]]@en[event handler]]]]は、
[[オブジェクト]]や[[要素]]の[[属性]]として1つ指定できる簡易版の[[イベントリスナー]]です。

[39] [[オブジェクト]]にあるものを[DFN[[RUBYB[イベントハンドラーIDL属性]@en[event handler IDL attribute]]]]
[WEAK[(旧・[DFN[[RUBYB[イベントハンドラーDOM属性]@en[event handler DOM attribute]]]])]]、
[[要素]]にあるものを[DFN[[RUBYB[イベントハンドラー内容属性]@en[event handler content attribute]]]]といいます
[SRC[>>35]]。

[61] [[イベントハンドラー]]の[[属性名]]は、[[イベント名]]に [CODE[on]] を付けたものです。

[EG[
[62] 例えば [CODE(DOMe)@en[[[click]]]] [[イベント]]の[[属性名]]は
[CODE@en[[[onclick]]]] となります。
]EG]

* 仕様書

[REFS[
- [35] '''[CITE@en-US-x-hixie[HTML Standard]] ([TIME[2013-05-05 06:42:10 +09:00]] 版) <https://www.whatwg.org/specs/web-apps/current-work/#event-handler-attributes>'''
- [214] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2017-02-25 17:12:45 +09:00]]) <https://html.spec.whatwg.org/#handler-messageport-onmessage>
- [70] [CITE@en[Service Workers Nightly]] ([TIME[2017-03-02 15:00:14 +09:00]]) <https://w3c.github.io/ServiceWorker/#service-worker-container-event-handlers>
]REFS]

* 意味

[97] [[イベントハンドラー]]は、[[イベントリスナー]]の特殊形です。
[[イベントハンドラー]]は特定の[[対象][イベント対象]]となる[[オブジェクト]]について、
特定の[[イベント型]]に関する、
非[[捕獲]]フェーズ ([[bubbling]] フェーズまたは[[対象]]フェーズ)
の[[イベントリスナー]]として働きます。

[FIG(list members)[ [215] [[イベントハンドラー]]の[[特性]]
: [DFN[[F[[RUBYB[[[イベントハンドラーイベント型]]]@en[event handler event type]]]]]] [SRC[>>35]] :
[[イベントハンドラー]]の[[イベント型]]。
: [F[[RUBYB[[[名前]]]@en[name]]]] :
[[イベントハンドラーイベント型]]の前に [CODE[[[on]]]] をつけたもの [SRC[>>35]]。
[[属性名]]として使われます。
: [F[[[イベントハンドラーIDL属性]]の[[型][型 (Web IDL)]]]] :
>>200
: [F[[RUBYB[[[値]]][value]]]] :
>>38
: [F[[RUBYB[[[オブジェクト]]]@en[object]]]] :
>>41
: [F[初回設定済み]] :
: [F[非null設定済み]] :
]FIG]

[EG[
[98] 例えば [CODE(DOMe)@en[[[click]]]] [[イベント]]に対応する[[イベントハンドラー]]の名前は
[CODE(DOMa)@en[[[onclick]]]] となります。 [CODE(DOMi)@en[[[Window]]]] [[オブジェクト]]には
[CODE(DOMa)@en[[[onclick]]]] [[属性]]があります。また [CODE(HTMLe)@en[[[a]]]]
[[要素]]にも [CODE(HTMLa)@en[[[onclick]]]] [[属性]]があります。
]EG]

[37] 任意の[[イベント型]]の名前に [CODE[[[on]]]] をつければ良いものではなく、
仕様で定義され、[[利用者エージェント]]が実装している[[イベントハンドラー]]のみ機能します。

[EG[
[99] 例えば [CODE[foobar]] という[[イベント型]]はどの仕様でも定義されていないので、 [CODE[onfoobar]]
[[属性]]を設定しても、 ([[著者]]が特定の [[Webページ]]のみで使われる独自の[[イベント型]]として使うのは自由ですが、)
[CODE[foobar]] [[イベント]]が [[dispatch]] されたときに呼び出されるわけではありません。

[100] 更に、 [CODE(DOMe)@en[[[DOMContentLoaded]]]] は [[HTML Standard]] で定義されている[[イベント型]]ではありますが、
[CODE[onDOMContentLoaded]] という[[イベントハンドラー]]はどこでも定義されていないので、
そのような[[属性]]を設定しても、 [[dispatch]] されたときに呼び出されるわけではありません。
]EG]

* イベント対象オブジェクト

[41] ほとんどの場合、[[イベントハンドラーIDL属性]]はその[[文脈オブジェクト]]の[[イベントハンドラー]]に、
[[イベントハンドラー内容属性]]はその[F[要素][ownerElement]]の[[イベントハンドラー]]に対応します。

[106] 例外的に、 [CODE(HTMLe)@en[[[body]]]] [[要素]]や [CODE(HTMLe)@en[[[frameset]]]]
[[要素]]の[[イベントハンドラーIDL属性]]や[[イベントハンドラー内容属性]]の一部は、 
[CODE(DOMi)@en[[[Window]]]] [[オブジェクト]]の[[イベントハンドラー]]に対応します。
[CODE(DOMi)@en[[[Window]]]] に属さない [CODE(HTMLe)@en[[[body]]]] [[要素]]のように、
対応する[[オブジェクト]]が存在していない[[イベントハンドラーIDL属性]]
[SRC[>>35]] や[[イベントハンドラー内容属性]]も存在します。

[36] [CITE[HTML Standard]] は、「[[イベントハンドラーIDL属性]]が存在しない[[オブジェクト]]の[[イベントハンドラー]]を晒す場合」
という形で対応する[F[オブジェクト]]が存在しない状態の動作も規定しています [SRC[>>35]]。
[[イベントハンドラー内容属性]]の場合はなぜか明言されていません。

* イベントハンドラー IDL 属性

[40] [[イベントハンドラーIDL属性]]は、特定の[F[イベントハンドラー]]に対応すると定義されている [[IDL属性]]です。
[[イベントハンドラーIDL属性]]の[F[属性名]]は、[F[イベントハンドラー]]の[F[名前]]と同じです
(つまり [CODE[on]] + [[イベント型]]です)。

[129] すべての[[イベントハンドラー]]に[[イベントハンドラーIDL属性]]があります。

-*-*-

[200] [[イベントハンドラーIDL属性]]の[F[型][型 (Web IDL)]]は、原則として 
[CODE(DOMi)@en[[[EventHandler]]]] です。

[75] [[型][型 (Web IDL)]] [DFN[[CODE(DOMi)@en[[[EventHandler]]]]]] は、
[[コールバック関数]]または [CODE[null]] です。
[[コールバック関数]]以外が指定された時は、 [CODE[null]] とみなされます
([CODE(IDL xattr)[TreatNonCallableAsNull]])。
[[コールバック関数]]は、 [CODE(DOMi)@en[[[Event]]]]
1つを[[引数]]とし、任意 ([CODE(IDL)@en[[[any]]]]) の[[返り値]]を持つものです。 [SRC[>>35]]

[76] 例外として、
[CODE(DOMa)@en[[[onerror]]]] の[[型][型 (Web IDL)]]は [CODE(DOMi)@en[[[OnErrorEventHandler]]]],
[CODE(DOMa)@en[[[onbeforeunload]]]] の[[型][型 (Web IDL)]]は 
[CODE(DOMi)@en[[[OnBeforeUnloadEventHandler]]]] です。
[CODE(DOMi)@en[[[OnErrorEventHandler]]]] は[[エラーの報告]]用の[[引数]]を取ることもでき、
[CODE(DOMi)@en[[[OnBeforeUnloadEventHandler]]]] は [CODE(DOMi)@en[[[DOMString]]]] または 
[CODE[null]] を返り値とします [SRC[>>35]]。

[105] [[JavaScript]] では、 [CODE(JS)@en[[[Function]]]] を [CODE(DOMi)@en[[[ErrorHandler]]]]
等の[[コールバック関数]]として使うことができます。

** 取得器

[42] [[イベントハンドラーIDL属性]]の[F[取得器]]は、
その[F[イベントハンドラー]][VAR[イベントハンドラー]]について、
次のようにしなければ[MUST[なりません]]
[SRC[>>35]]。

[FIG(steps)[
= [204] [VAR[イベントハンドラー]]の[F[オブジェクト]]が [CODE[null]] でない場合、
== [203] [[[VAR[イベントハンドラー]]の現在値を取得]]した結果を返します。
= [205] それ以外の場合、
== [206] [CODE[null]] を返します。
]FIG]

** 設定器

[46] [[イベントハンドラーIDL属性]]の[F[設定器]]は、
その[F[イベントハンドラー]][VAR[イベントハンドラー]]について、
次のようにしなければ[MUST[なりません]] [SRC[>>35]]。

[FIG(steps)[
= [201] [VAR[新しい値]]を、指定された値を本[[IDL属性]]の[F[型][型 (Web IDL)]]と解釈した結果に設定します。
= [83] [VAR[新しい値]]に[[[VAR[イベントハンドラー]]の値を設定]]します。
]FIG]

* イベントハンドラー内容属性

[47] [[イベントハンドラー内容属性]]は、特定の[F[イベントハンドラー]]に対応すると定義されている[[内容属性]]で、
[F[名前空間]]は[[null名前空間]]で、[F[局所名]]は[F[イベントハンドラー]]の[F[名前]]です [SRC[>>35]]。

[130] [[イベントハンドラー内容属性]]は [[HTML]]、[[SVG]]、[[XUL]] の[[要素]]で定義されています。
[[イベントハンドラー内容属性]]があって[[イベントハンドラーIDL属性]]がないケースは今のところありません。
[[要素]]の[[イベントハンドラー]]で[[イベントハンドラー内容属性]]がないケースもありません。

** 属性値の JavaScript コード

[48] [[イベントハンドラー内容属性]]の[F[属性値]]は、 [[JavaScript]] のコードであって、
[[自動セミコロン挿入]]を経て [CODE(JS)@en[[[FunctionBody]]]] [[生成規則]]に一致するようなものでなければ[['''なりません''']]
[SRC[>>35]]。

;; [49] つまり、 [[JavaScript]] の[[関数]]の括弧の中身として書けるものでなければなりません。

[146] 構文上の誤りが含まれる場合、最初のコンパイル時 ([[イベント]]が [[dispatch]]
された時か、[[イベントハンドラーIDL属性]]の値を取得した時) に[[誤りの報告]]があります。

[147] 実行時には、原則として、 [CODE[event]] という名前の[[引数]]が1つ渡されます。
これは[[イベントオブジェクト]]です。

[152] [[scope chain]] は、近い順に ([[対象][イベント対象]]の[[要素]], [[フォーム所有子]], [[大域オブジェクト]]) となります。
つまり、[[関数]]内で[[宣言]]された[[変数]]では無いものが参照された時、まず[[要素]]の[[メンバー]]と解釈します。
次に、[[要素]]の属する[[フォーム]]の[[メンバー]]と解釈します。どちらでもなければ、
[[大域変数]]と解釈します。

[EG[
[231] 次の例では、 [CODE(HTMLe)@en[button]] を [CODE(DOMe)@en[click]] すると、
「[CODE[post]]」と表示されます。

[PRE(HTML code)[
<form method=post action=...>
  <button type=button onclick=" alert (method) ">???</button>
</form>
]PRE]
]EG]

** 属性の設定

[112] [[イベントハンドラー内容属性]][VAR[属性]]が[[設定][属性の設定]]された時、
その[F[イベントハンドラー]][VAR[イベントハンドラー]]について、
次のようにします [SRC[>>35]]。

[FIG(steps)[
= [209] [VAR[結果]]を、[VAR[属性]]の[F[要素][ownerElement]]と「[CODE[[[script attribute]]]]」、
[VAR[属性]]の[F[値][属性値]]について、
[[Should element's inline behavior be blocked by Content Security Policy?]]
を実行した結果に設定します。
= [210] [VAR[結果]]が [CODE[Blocked]] ''以外''なら、
== [216] [VAR[属性]]の[F[値][属性値]]と[VAR[位置]]の[[内部生未コンパイルハンドラー]]に[[[VAR[イベントハンドラー]]の値を設定]]します。
]FIG]

;; [161] つまり[[属性の設定]]時点で [[CSP]] で[[イベントハンドラー内容属性]]が無効化されていれば、
何も起こりません。

[212] [VAR[位置]]について、 [CITE[HTML Standard]] は[VAR[属性]]の[F[値][属性値]]を設定したスクリプトの位置と規定しています [SRC[>>35]]。
[[構文解析器]]によって[[属性が設定][属性を設定]]された場合にどうするべきなのかは不明です。

** 属性の削除

[160] [[イベントハンドラー内容属性]]が[[削除][属性の削除]]された時、
その[F[イベントハンドラー]][VAR[イベントハンドラー]]について、
次のようにします [SRC[>>35]]。

[FIG(steps)[
= [217] [CODE[null]] に[[[VAR[イベントハンドラー]]の値を設定]]します。
]FIG]

* XXX

@@ [207] [[イベントハンドラーIDL属性]]設定時点で[VAR[イベントハンドラー]]の[F[イベント対象]]が存在せず、その後[[節点の挿入]]が発生した場合、...

@@ [208] [[イベントハンドラーIDL属性]]設定後に[VAR[イベントハンドラー]]の[F[イベント対象]]が存在しなくなった ([[節点の削除]]があった) 場合、 ...


* 値

[38] [[イベントハンドラー]]の値は、

[FIG(list)[
- [CODE[null]]
- [[コールバックオブジェクト]]
- [[内部未コンパイル生ハンドラー]]
]FIG]

... のいずれかです。初期値は [[null]] です。 [SRC[>>35]] [[イベントハンドラーIDL属性]]により、
または[[イベントハンドラー内容属性]]により、[CODE[null]] 以外の値に設定することができます。

[131] [DFN[[RUBYB[[[内部生未コンパイルハンドラー]]]@en[internal raw uncompiled handler]]]]は、
コンパイル前のスクリプト本体と、エラー報告の際に用いられるスクリプトの位置情報の組です。 [SRC[>>35]]
これは実質的には[[イベントハンドラー内容属性]]の[[属性値]]のことを言っています。
後述の通り[[イベントハンドラー内容属性]]は設定されただけではコンパイルされず、
実行時にコンパイルされることになります。 (コンパイル結果である [CODE(JS)@en[[[Function]]]]
とは異なります。)

[213] [VAR[新しい値]]に[DFN[[VAR[イベントハンドラー]]の値を設定]]するには、次のようにします [SRC[>>35]]。

[FIG(steps)[
= [211] [VAR[イベントハンドラー]]の[F[オブジェクト]]が存在する場合 (>>41)、
== [202] [VAR[イベントハンドラー]]の[F[オブジェクト]]の[F[[VAR[イベントハンドラー]]]]を、
[VAR[新しい値]]に設定します。
== [221] [VAR[イベントハンドラー]]の[F[非null設定済み]]が[[偽]]の場合、
=== [64] [VAR[イベントハンドラー]]の[F[オブジェクト]]の[F[イベントリスナー群]]の末尾に、
新しい[[イベントリスナー]]を追加します。
[FIG(list members)[ [223] [[イベントリスナー]]

: [F[イベント型]] : [VAR[イベントハンドラー]]の[F[イベント型][イベントハンドラーイベント型]]
: [F[コールバック]] : 
[FIG(list members)[ [114] [CODE(DOMi)@en[EventListener]] ([[関数]])
: [F[引数]] : ([VAR[引数]])
: [F[処理]] : 
[FIG(steps)[
= [224] [VAR[イベントハンドラー]]と[VAR[引数]]について[[イベントハンドラー処理アルゴリズム]]を実行します。
]FIG]
: [F[コールバック文脈]] : 任意の値
]FIG]

]FIG]
=== [222] [VAR[イベントハンドラー]]の[F[非null設定済み]]を、[[真]]に設定します。
== [128] [VAR[イベントハンドラー]]の[F[初回設定済み]]が[[偽]]で、
[VAR[イベントハンドラー]]の[F[オブジェクト]]が [CODE(DOMi)@en[MessagePort]] で、
[VAR[イベントハンドラー]]の[F[イベント型][イベントハンドラーイベント型]]が
[CODE(DOMe)@en[message][onmessage]] の場合、
=== [218] [VAR[イベントハンドラー]]の[F[オブジェクト]]の[F[[[ポートメッセージキュー]]の状態]]が[[無効]]なら、
==== [219] [VAR[イベントハンドラー]]の[F[オブジェクト]]の[[ポートメッセージキューの有効化]]を実行します。 [SRC[>>214]]
=== [220] [VAR[イベントハンドラー]]の[F[初回設定済み]]を、[[真]]に設定します。
== [82] [VAR[イベントハンドラー]]の[F[初回設定済み]]が[[偽]]で、
[VAR[イベントハンドラー]]の[F[オブジェクト]]が [CODE(DOMi)@en[ServiceWorkerContainer]] で、
[VAR[イベントハンドラー]]の[F[イベント型][イベントハンドラーイベント型]]が
[CODE(DOMe)@en[message][onmessage]] の場合、
=== [122] [VAR[イベントハンドラー]]の[F[オブジェクト]]の[F[[[クライアントメッセージキュー]]の状態]]が[[無効]]なら、
==== [238] [VAR[イベントハンドラー]]の[F[オブジェクト]]の[[クライアントメッセージキューの有効化]]を実行します。 [SRC[>>70]]
=== [239] [VAR[イベントハンドラー]]の[F[初回設定済み]]を、[[真]]に設定します。
]FIG]

;; [65] [[イベントハンドラー]]の[F[値]]が [CODE[null]] に設定されている間は、
[[イベントリスナー]]は追加されません。また
[CODE[null]] に変更されたり、別の非 [CODE[null]] 値に変更されたりしても、
[[イベントリスナー]]は登録されたままになります。
これは[[イベントリスナー]]間の実行順序に影響することになります。

;; [66] [[イベントハンドラー]]と[[イベントリスナー]]や[[イベントハンドラー処理算法]]は別のものとなります。
[[イベントハンドラー]]から [CODE(JS)@en[[[arguments]].[[callee]]]]
でアクセスできるのは[[イベントハンドラー]]です。[[イベントリスナー]]や[[イベントハンドラー処理算法]]に [[JavaScript]]
からアクセスする方法はありません。[[イベントハンドラー]]を [CODE(DOMm)@en[[[removeEventListener]]]]
しても、それ自体は[[イベントリスナー]]として登録されていないので、削除できません。

[88] [CODE(DOMi)@en[MessagePort]] と
[CODE(DOMi)@en[ServiceWorkerContainer]] の [CODE(DOMa)@en[[[onmessage]]]] 
は最初に設定された時に[[ポートメッセージキュー]]や[[クライアントメッセージキュー]]が有効になる
[WEAK[([CODE(DOMm)@en[start][MessagePort]] [[メソッド]]や [CODE(DOMm)@en[startMessages]] [[メソッド]]が呼ばれたかのように振る舞う)]]
という副作用があります。

;; [107] [CODE(DOMm)@en[[[addEventListener]]]] によって [CODE(DOMe)@en[[[message]]]] に登録してもこのような副作用はありません。

;; [184] [CODE(DOMa)@en[onmessage]]、[CODE(DOMm)@en[start][MessagePort]]、[CODE(DOMm)@en[startMessages]] も参照。

** イベントハンドラーの現在値

[132] [DFN[[RUBYB[[[[VAR[イベントハンドラー]]の現在値を取得]]]@en[getting the current value of the event handler]]]]は、
次のようにしなければ[MUST[なりません]] [SRC[>>35]]。

[FIG(steps)[
= [115] [VAR[イベントハンドラー]]の[F[値]]が[[内部生未コンパイルハンドラー]]の場合、
== [116] [VAR[イベントハンドラー]]の[F[オブジェクト]]が[[要素]]の場合、
=== [139] [VAR[要素]]を、[VAR[イベントハンドラー]]の[F[オブジェクト]]に設定します。
=== [225] [VAR[文書]]を、[VAR[要素]]の[F[節点文書]]に設定します。
== [226] それ以外の場合、
=== [227] [VAR[要素]]を、 [CODE[null]] に設定します。
=== [228] [VAR[文書]]を、 [VAR[イベントハンドラー]]の[F[オブジェクト]]の[F[文書]]に設定します。
== [172] [VAR[設定群]]を、[VAR[文書]]の[F[関連設定群オブジェクト]]に設定します。
== [263] 
[VAR[realm]]
を、
[VAR[設定群]]の
[F[Realm]]
に設定します。
== [264] 
[VAR[適用範囲]]を、
[VAR[realm]]
の
[F(ss)[GlobalEnv]]
に設定します。
== [236] [VAR[要素]]が [CODE[null]] ''以外''の場合、
=== [141] [VAR[適用範囲]]を、[CODE[[[NewObjectEnvironment]]([VAR[文書]], [VAR[適用範囲]])]] の結果に設定します。
== [229] [VAR[文書]]の[F[スクリプトが無効]]の場合、
=== [230] [CODE[null]] を返し、ここで停止します。
== [232] [VAR[要素]]が [CODE[null]] ''以外''の場合、
=== [234] [VAR[要素]]の[F[フォーム所有子]]が [CODE[null]] 以外の場合、
==== [237] [VAR[適用範囲]]を、[CODE[[[NewObjectEnvironment]]([VAR[要素]]の[F[フォーム所有子]], [VAR[適用範囲]])]] の結果に設定します。
=== [233] [VAR[適用範囲]]を、[CODE[[[NewObjectEnvironment]]([VAR[要素]], [VAR[適用範囲]])]] の結果に設定します。
== [135] [VAR[結果]]を、[VAR[イベントハンドラー]]の[F[値]]の[F[値]]を [CODE[FunctionBody]]
として[[構文解析]]した結果に設定します。
== [140] [VAR[結果]]が[[構文解析]]不能または [[early error]] の場合、
=== [180] [VAR[イベントハンドラー]]の[F[値]]を、 [CODE[null]] に設定します。
=== [176] [VAR[結果]]を、
[VAR[結果]]、[VAR[イベントハンドラー]]の[F[値]]の[F[位置]]、[VAR[設定群]]の[F[大域オブジェクト]]について[[誤りを報告]]した結果に設定します。
=== [177] [VAR[結果]]が「[[not handled]]」の場合、
==== [178] [[開発者コンソール]]に[[誤り]]を報告して[MAY[構いません]]。
=== [179] [CODE[null]] を返し、ここで停止します。
== [181] [[JavaScript実行文脈スタック]]に、[VAR[設定群]]の[F[realm実行文脈]]を [[push]]
します。
== [182] [VAR[関数]]を、 [CODE[FuncrionCreate]] の結果に設定します。
[FIG(list members nested)[
:[VAR[[[kind]]]]: [RUBYB[[[通常]]]@en[Normal]]
:[142] [VAR@en[[[ParameterList]]]]: 
[FIG(switch)[

: [VAR[イベントハンドラー]]の[F[オブジェクト]]が [CODE(DOMi)@en[Window]] で、[VAR[イベントハンドラー]]の[F[イベント型][イベントハンドラーイベント型]]が [CODE(DOMe)@en[error][onerror]] の場合 :
([CODE[[[event]]]], [CODE[[[source]]]], [CODE[[[lineno]]]], [CODE[[[[[colno]]]], [CODE[[[error]]]])
: それ以外の場合 :
([DFN[[CODE[[[event]]]]]])

]FIG]
:[144] [VAR@en[[[Body]]]]: [VAR[結果]]
:[145] [VAR@en[[[Scope]]]]: [VAR[適用範囲]]

]FIG]
== [143] [[JavaScript実行文脈スタック]]から、[VAR[設定群]]の[F[realm実行文脈]]を削除します。
== [258] 
[VAR[関数]]の
[F(ss)[ScriptOrModule]]
を、
[CODE[null]]
に設定します。
== [183] [VAR[イベントハンドラー]]の[F[値]]を、 [VAR[関数]]に設定します。
= [133] [VAR[イベントハンドラー]]の[F[値]]を返します。
]FIG]

;; [134] [[[VAR[イベントハンドラー]]の現在値を取得]]する操作は、
[VAR[イベントハンドラー]]の[F[オブジェクト]]が[[要素]]または
[CODE(DOMi)@en[Window]] の場合にのみ呼ばれます。
[VAR[イベントハンドラー]]の[F[オブジェクト]]が [CODE[null]] の場合には、呼ばれません。

* イベントハンドラー処理アルゴリズム

[117] [DFN[[RUBYB[[[イベントハンドラー処理アルゴリズム]]]@en[the event handler processing algorithm]]]]は、
[[イベントハンドラー]]を呼び出すという[[イベントリスナー]]です。

[[イベントハンドラー]][VAR[イベントハンドラー]]と[[イベントオブジェクト]][VAR[イベント]]について、
次のようにします [SRC[>>35]]。

[FIG(steps)[
= [118] [VAR[コールバック]]を、[[[VAR[イベントハンドラー]]の現在値を取得]]した結果に設定します。
= [119] [VAR[コールバック]]が [CODE[null]] でなければ、
== [189] 
[VAR[イベント]]の[F[型][イベント型]]が [CODE(DOMe)@en[error]] で、
[VAR[イベント]]の[F[インターフェイス][イベントインターフェイス]]が
[CODE(DOMi)@en[ErrorEvent]] で、
[VAR[イベント]]の[F[現在対象]]が [CODE(DOMe)@en[WindowOrWorkerGlobalScope]] の場合、
=== [125] [VAR[引数]]を、 ([VAR[イベント]]の[F[メッセージ][message (ErrorEvent)]],
[VAR[イベント]]の[F[ファイル名][filename (ErrorEvent)]],
[VAR[イベント]]の[F[行番号][lineno (ErrorEvent)]],
[VAR[イベント]]の[F[列番号][colno (ErrorEvent)]],
[VAR[イベント]]の[F[誤り][error (ErrorEvent)]]) に設定します。
== [190] それ以外の場合、
=== [188] [VAR[引数]]を、 ([VAR[イベント]]) に設定します。
== [120] [VAR[返り値]]を、[VAR[コールバック]]について[[コールバック関数を呼び出し]]た結果に設定します。
[FIG(list members)[
: [VAR[[[コールバック[CODE[this]]値]]]] : [VAR[イベント]]の[F[現在対象]]
: [VAR[引数]] : [VAR[引数]]
]FIG]
[[例外]]が[[投げ]]られたら、[[再び投げ]]、ここで停止します。
== [124] [VAR[イベント]]の[F[型][イベント型]]が [CODE(DOMe)@en[error]] で、
[VAR[イベント]]の[F[インターフェイス][イベントインターフェイス]]が
[CODE(DOMi)@en[ErrorEvent]] で、
[VAR[イベント]]の[F[現在対象]]が [CODE(DOMe)@en[WindowOrWorkerGlobalScope]] の場合、
=== [126] [VAR[返り値]]が[[真]]なら、
==== [127] [VAR[イベント]]の[F[取り消しフラグ]]を設定します。
== [193] それ以外で、[VAR[イベント]]の[F[型][イベント型]]が [CODE(DOMe)@en[beforeunload]] で、
[VAR[イベント]]の[F[インターフェイス][イベントインターフェイス]]が
[CODE(DOMi)@en[BeforeUnloadEvent]] の場合、
=== [194] [VAR[返り値]]が [CODE[null]] 以外なら、
==== [195] [VAR[イベント]]の[F[取り消しフラグ]]を設定します。
==== [196] [VAR[イベント]]の [F[[CODE(DOMa)@en[returnValue]]]] が[[空文字列]]なら、
===== [197] [VAR[イベント]]の [F[[CODE(DOMa)@en[returnValue]]]] を、[VAR[返り値]]に設定します。
== [187] それ以外の場合、
=== [191] [VAR[返り値]]が[[偽]]なら、
==== [192] [VAR[イベント]]の[F[取り消しフラグ]]を設定します。
]FIG]

[198] 本[[アルゴリズム]]は、[[イベントハンドラー]]が最初に設定されたときに[[イベントリスナー]]として登録されます。
それ以外では使われません。登録済みの[[イベントリスナー]]を[[スクリプト]]から取得する方法は用意されていませんから、
本[[アルゴリズム]]に相当する [[JavaScript]] [[関数オブジェクト]]に[[スクリプト]]からアクセスする方法もありません。

[EG[
[74] [[コールバック[CODE[this]]値]]の規定と、 [CODE(HTMLe)@en[[[body]]]]
の [CODE(HTMLa)@en[[[onload]]]] が [CODE(DOMi)@en[[[Window]]]] [[オブジェクト]]の[[イベントハンドラー]]であることから、
[PRE(HTML example code)[
<body onload="alert(this)" onclick="alert(this)">
]PRE]
... は文書の読み込み時に [CODE["[object Window]"]] が、[[クリック]]時に
[CODE["[object HTMLBodyElement]"]] が [SRC[>>35]] [CODE(JS)@en[[[alert]]]] されることとなります。
]EG]

* 特別なイベントハンドラーの一覧

[FIG(list)[
- [43] [CODE(HTMLe)@en[[[body]]]] や [CODE(HTMLe)@en[[[frameset]]]] の[[イベントハンドラーIDL属性]]、[[イベントハンドラー内容属性]]の一部
-- 当該[[オブジェクト]]ではなく [CODE(DOMi)@en[[[Window]]]] に対応する[[イベントハンドラー]]です。
- [44] [CODE(DOMi)@en[[[MessagePort]]]] と [CODE(DOMi)@en[ServiceWorkerContainer]] の [CODE(DOMa)@en[[[onmessage]]]]
-- 副作用を持ちます (>>88)。
- [45] [CODE(DOMi)@en[[[Window]]]]/[CODE(DOMi)@en[[[WorkerGlobalScope]]]] の [CODE(DOMa)@en[[[onerror]]]]
-- [DEL[[[DOMイベント]]以外でも使われます。]]
-- [[エラーの報告]]を参照。
- [108] [CODE(DOMe)@en[[[onbeforeunload]]]]
-- 返り値が異なります (>>127)。

[HISTORY[
- [109] [CODE(DOMe)@en[[[onmouseover]]]]
-- 返り値の解釈が異なります。
]HISTORY]
]FIG]

* イベントハンドラーの一覧

[8] この種の[[属性]]のリストは[[事象取扱器属性の一覧]]を参照してください。

* イベントハンドラーとイベントリスナー

[69] [[イベントハンドラー]]は、 [CODE(DOMm)@en[[[addEventListener]]]] で登録される一般の[[イベントリスナー]]と違って、
次のような制限があります。

[FIG(list)[
- [71] [[オブジェクト]]と[[イベント型]]に対して1つしか処理を登録できません。
[[ライブラリー]]などが互いに干渉せずに処理を指定するには不都合です。
- [72] 予め規定され実装された特定の[[イベント型]]の処理の登録にしか使えません。
新しく追加されまだ実装されていない[[イベント型]]や、[[応用]]依存の独自の[[イベント型]]には使えません。
- [73] [[bubbling phase]] のみであり、[[capturing phase]] に実行させることはできません。
]FIG]

[81] こういった制限もありますが、簡潔に記述でき多くの用途には十分でもあるので、
[[イベントハンドラー]]もよく使われています。

* 歴史

** 誕生

[84] [[イベントハンドラー]]は、当初から [[JavaScript]] の機能として存在していました。

;; [85] [[W3C DOM]] には含まれていないため、00年代には [[DOM0]] の一部とされていました。

;; [101] 現在は[[イベントリスナー]]の特殊形とされていますが、当時はまだ[[イベントリスナー]]はありませんでした。
[[イベントリスナー]]は [[IE4 DOM]] で追加されました。

[270] 
[CITE[Navigator Scripting]], [TIME[2024-08-16T09:22:50.000Z]], [TIME[1997-06-06T18:19:26.337Z]] <http://web.archive.org/web/19970606181855fw_/http://www28.netscape.com/eng/mozilla/2.0/handbook/javascript/script.html>

JS 1.0

[271] [CITE[null]], [TIME[2024-08-16T09:30:36.000Z]], [TIME[2001-02-08T10:34:31.827Z]] <https://web.archive.org/web/20010208103254/http://home.netscape.com/eng/mozilla/3.0/handbook/javascript/getstart.htm#996824>

JS 1.1

** スクリプト言語の指定

- [1] [[HTML]] の on[VAR[*]] 属性 (非推奨。) で [[JavaScript]] を使う時に、先頭に [[javascript:]] って書く DQN がなぜか多いな。
- [2] >>1 まあ [[Content-Script-Type:]] 問題についての[[不思議マーク付け]]的解法なのかもしれんが。。。(w
- [3] >>1-2 にしても、文法エラーにならずに動く (こともある。) なんて、一体どうなっているんだ? JavaScript 的にはどういう扱いになってるんだろう? それとも [[UA]] の補正なのかな?
- [4] >>3 [[ラベル]]。

[5]
>>1-4 [[WinIE]] だとそれが“ちゃんと”はたらいて、 [CODE[vbscript:]] と書くと [[VBScript]] になったりしちゃいます。

[10] 
>748 名前:Name_Not_Found[sage] 投稿日:2005/10/08(土) 04:12:41 ID:???
>
 HTML のイベント属性に javascript: を書くことについて。
 - 文法的には、ただのラベルである。
 - そこそこ誰でも知っていて、なんとなく使ったり読んだりしている。
 - WinIE が、javascript, jscript, vbscript, vbs, perlscript に反応する。
 &#160;&#160;(プラットフォームも含め、過不足あれば指摘してくれ。)
 - しかし、きちんとした仕様説明が見当たらない (探せなかっただけかもしれないが)。

 ラベル
 ttp://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/12_Statements.html#LabelledStatement
 &#160;&#160;FOO: for ( .. ) for ( .. ) if ( .. ) continue FOO;
 におけるラベル FOO と同じ。
 ラベルの例をもう一つ。
 &#160;&#160;<p onclick="rubyscript:while (true)
 &#160;&#160;&#160;&#160;for (var i = 0; i < 10; i++)
 &#160;&#160;&#160;&#160;if (i == 6) break rubyscript;
 &#160;&#160;&#160;&#160;alert(i);">alert(6)</p>

 どうやら、良く練られた拡張ではなく、姑息な特例だと言わざるを得ない。
 
;;
[CITE@ja[+ JavaScript の質問用スレッド vol.41 +]]
<http://pc8.2ch.net/test/read.cgi/hp/1127133050/>

** 内部での表現

[9] [CITE[Hawk's W3 Laboratory : DHTML Tips : イベントハンドラに関する考察]] [DEL[<http://www.hawk.34sp.com/stdpls/dhtml/event-handler.html>]]
<http://web.archive.org/web/20061021223123/www.hawk.34sp.com/stdpls/dhtml/event-handler.html>

>
:更新日時:    2004年09月22日
>
結論から言うと、この「属性の中身のコード」は、対象となる要素に対応するHTMLElementオブジェクトのプロパティに、関数の形で格納されています。イベント発生時にはそのオブジェクトのメソッドとして実行されるわけです。
>
実体が関数であることは、イベント内でargumentsを参照できることから分かります。更に一歩進んでarguments.calleeにアクセスすれば実体の関数そのものにアクセスできます。
>
以下の例では関数の内容を表示しています。alert(arguments.callee);という記述が "そのまま"表示されるのが確認できるでしょう。
>
[PRE(HTML example code)[
<a href="http://hawk.34sp.com/" onmouseover="alert(arguments.callee);">リンク</a>
]PRE]
ただし、実際に試してみれば分かりますが、表示内容(すなわち実装方法)はブラウザによって大きく2系統に分かれます。上記の例はIEでは以下のように表示されるはずです。
>
[PRE[
function anonymous()
{
alert(arguments.callee);
}
]PRE]
>
anonymous(匿名)とは無名のFunctionオブジェクトに仮に付けられた名です。つまりIEでは、単に属性値のスクリプトコードを実行するだけの関数が生成され、対象となるオブジェクトのプロパティに格納されることになります。
>
一方で、NN4.XおよびGeckoベースのブラウザでは以下のようになります。
>
[PRE[
function onmouseover(event)
{
alert(arguments.callee);
}
]PRE]
>
Operaではこうです。
>
[PRE[
function anonymous(event)
{
alert(arguments.callee);
}
]PRE]
>
KHTMLベースのブラウザではこうなります。
[PRE[
function (event)
{
alert(arguments.callee);
}
]PRE]
>
名前の有無や名前が無い場合の表現など、瑣末な違いはありますが、いずれもeventという仮引数が存在していることが大きな特徴です。この仮引数はイベントオブジェクト(NN4.Xにおいてはevent object、その他の場合はDOM2 EventsにおけるEventインターフェイスを実装したオブジェクト)を表しています。
>
NN4.Xのイベントモデルでも、DOM2 Eventsでも、イベントに関する情報はイベントオブジェクトの形で、イベントハンドラとして登録された関数の第一引数に渡されます。だからこのような形の関数になるのは理にかなっているのですが、そのとき仮引数の名前が”event”になることなどは特に標準化されていないので注意が必要です。
>
またこのeventという名前は、偶然にも?IEのwindow.eventと同じなので、
>
[PRE(HTML example code)[
<a href="http://hawk.34sp.com/" onmouseover="foo(event);">リンク</a>
]PRE]
このように記述すれば、関数fooにはブラウザを問わず第一引数にeventオブジェクトが渡されます(もっともfoo内での条件分岐は必要になりますが)。 

;; [11] [[関数]]内で[[関数]]名を使って再起呼び出しできるのかな?

** [CODE(JS)@en[window.event]]

[6] [[WinIE7]], [[Opera]], [[WebKit]] は対応しているみたいです。

[7] 
[[Firefox3]] は対応していないみたいです。

;; [12] [[事象取扱器属性]]の時だけでなく、 [CODE(DOMm)@en[[[attachEvent]]]]
した[[事象取扱器]]の時にも設定されているの?

[137] [CITE[Bug 111602 – Remove window.event]]
( ([TIME[2013-03-20 00:57:40 +09:00]] 版))
<https://bugs.webkit.org/show_bug.cgi?id=111602>

[138] [CITE@en[window.event and Event.srcElement]]
( ([[Anne van Kesteren]] 著, [TIME[2013-03-25 22:44:19 +09:00]] 版))
<http://lists.w3.org/Archives/Public/public-webapps/2013JanMar/0961.html>

** HTML4

[151] [[XHTML m12n]] では [DFN[[[XHTML Events Module]]]] が定義されており、
現在の[[イベントハンドラー内容属性]]が含まれていました。

[269] [[CEA-2014-B]]

** 忌避

[63] [[イベントハンドラー内容属性]]は [[HTML4]] には一般的なものが含まれたものの、
[[DOM Events]] が標準化された後も改めて厳密に定義され直すことはなく、
[[Webブラウザー]]の実装は長らく明文化されないままでした。
[[イベントハンドラーIDL属性]]は [[Web Applications 1.0]] まで言及もされていませんでした。

[67] そのため表示方法を記述する[[物理属性]]と同様に避けるべきだと主張する人達も00年代には少なくありませんでした。
当時の [[HTML WG]] も、[[イベントハンドラー内容属性]]にかわって [[XHTML Events]]
改め [[XML Events]] を開発し、それによって置き換えることを狙っていたようです。

[68] しかし[[イベントハンドラー]]が簡潔で便利でしたし、 [[W3C DOM]] の
[CODE(DOMm)@en[[[addEventListener]]]] と [[IE4 DOM]] の [CODE(DOMm)@en[[[attachEvent]]]]
に分裂していたこの時代、 [[XML Events]] も含めどの方法も他の方法を完全に置き換える程の勢力は得られませんでした。

** HTML Standard

[13] [CITE@en[(X)HTML5 Tracking]]
([TIME[2009-09-30 00:13:50 +09:00]] 版)
<http://html5.org/tools/web-apps-tracker?from=4049&to=4050>

[14] [CITE['''['''whatwg''']''' Additional onxxxx event attributes for DOM Level3 Events]]
([TIME[2010-12-01 08:26:00 +09:00]] 版)
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2010-November/029252.html>

[15] [CITE@en[Web Applications 1.0 r5933 Be better about how we define the creation of scripts for event handler attributes (specifically, how we interact with the JS spec).]]
( ([TIME[2011-03-04 09:52:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=5932&to=5933>

[16] [CITE[''''''[''''''whatwg'''''']'''''' on* attributes on DOM elements]]
( ([TIME[2011-06-18 08:37:31 +09:00]] 版))
<http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2011-June/032146.html>

[17] [CITE[IRC logs: freenode / #whatwg / 20110728]]
( ([TIME[2011-08-07 22:56:46 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20110728#l-242>

[18] [CITE[IRC logs: freenode / #whatwg / 20111117]]
( ([TIME[2011-11-19 14:21:09 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20111117>

[19] [CITE[''''''[''''''whatwg'''''']'''''' API design restrictions due to barewords in onxxx="" attributes]]
( ([TIME[2011-12-03 12:41:47 +09:00]] 版))
<http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2011-November/033959.html>

[20] [CITE@en[Writing forward-compatible websites - MDN]]
( ([TIME[2011-12-03 12:41:52 +09:00]] 版))
<https://developer.mozilla.org/Writing_Forward_Compatible_Websites>

[21] [CITE[IRC logs: freenode / #whatwg / 20120427]]
( ([TIME[2012-05-06 12:41:01 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20120427#l-633>

[22] [CITE[IRC logs: freenode / #whatwg / 20120518]]
( ([TIME[2012-05-31 20:23:25 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20120518>

[23] [CITE@en[''''''[''''''proximity'''''']'''''' HTML's WebIDL Function]]
( ([[Marcos Caceres]] 著, [TIME[2012-05-28 20:25:42 +09:00]] 版))
<http://lists.w3.org/Archives/Public/public-device-apis/2012May/0283.html>

[24] [CITE[IRC logs: freenode / #whatwg / 20120620]]
( ([TIME[2012-07-04 21:39:52 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20120620#l-321>

[25] [CITE@en[Web Applications 1.0 r7235     Improve compatibiliy for legacy features.]]
( ([TIME[2012-08-10 03:02:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7234&to=7235>

[26] [CITE[''''''[''''''whatwg'''''']'''''' Specification unclear about how HTMLElement.prototype.onscroll's getter/setter should behave for "body" elements]]
( ([TIME[2012-12-04 06:17:20 +09:00]] 版))
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2012-December/038221.html>

[27] [CITE@en[Web Applications 1.0 r7560     Remove some IDL shadowing. See also bug 20225.]]
( ([TIME[2012-12-04 09:43:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7559&to=7560>

[28] [CITE@en[Web Applications 1.0 r7561     Recent changes to body also apply to frameset.]]
( ([TIME[2012-12-05 03:47:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7560&to=7561>

[29] [CITE@en[WICD Mobile 1.0]]
( ([TIME[2010-08-17 16:50:39 +09:00]] 版))
<http://www.w3.org/TR/WICDMobile/#XHTML-event-attributes>

[30] [CITE[''''''[''''''whatwg'''''']'''''' Specification unclear about how HTMLElement.prototype.onscroll's getter/setter should behave for "body" elements]]
( ([TIME[2013-01-08 08:36:05 +09:00]] 版))
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2013-January/038528.html>

[31] [CITE@en[Web Applications 1.0 r7638 Factor out some common event handler declarations in IDL.]]
( ([TIME[2013-01-08 08:45:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7637&to=7638>

[32] [CITE@en[Web Applications 1.0 r7667 Clean up how we define event handlers that are shadowed for Window on <body>.]]
( ([TIME[2013-01-30 04:18:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7666&to=7667>

[33] [CITE@en[Web Applications 1.0 r7668     Fix bug 18626 and actually do what the previous checkin was trying to do.]]
( ([TIME[2013-01-30 05:12:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7667&to=7668>

[86] [CITE@en[Web Applications 1.0 r7933     Bring onbeforeunload handling closer to compatibility with the Web]] ([TIME[2013-06-08 06:01:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=7932&to=7933>

[87] [CITE@en[Bug 20637 – Remove onfullscreen* from HTML]]
( ([TIME[2013-06-08 22:18:21 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=20637>

[89] [CITE@en[Web Applications 1.0 r8097 Add more cross references to the new 'concept-window-document' thing, and clean up <frameset>'s event definitions (I always forget to update that when I'm updating <body>'s...).]]
( ([TIME[2013-07-28 00:48:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8096&to=8097>

[90] [CITE@en[Web Applications 1.0 r2529        MAJOR CHANGES: Revamp the way scripts are specified, along with their interaction with resolving relative URLs, etc. Give enough detail to justify objects in the DOM not being garbage collected randomly when still in use. Define script groups, to handle scripts going away during document.open() and session history navigation. Define why and how setTimeout(), database transactions, etc, handle page transitions. Drop the terms 'with' and 'without' script, use script is 'enabled'/'disabled' instead. Define 'unload' and 'beforeunload'. Rework how onfoo='' and .onfoo event handler attributes are defined. Rework how the content model of <noscript> is defined. Reword the way javascript: is defined to use the new terminology. Add a few notes of things that came up while I was doing all that.]]
( ([TIME[2008-12-12 17:46:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=2528&to=2529>

[91] [CITE[''''''[''''''whatwg'''''']'''''' Should onfoo event handler properties be on Element or HTMLElement?]]
( ([TIME[2013-10-09 08:53:50 +09:00]] 版))
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2013-October/040992.html>

[92] [CITE@en[Web Applications 1.0 r8303     Move the event handler content attribute compiling logic to later in the pipeline, for better consistency with Firefox/Safari (and other browsers, though to a lesser extent).]]
( ([TIME[2013-11-21 06:09:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8302&to=8303>

[93] [CITE@en[Web Applications 1.0 r8282     OnBeforeUnloadEventHandler is supposed to allow null return values (and some markup error fixes, oops)]]
( ([TIME[2013-11-14 07:45:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8281&to=8282>

[94] [CITE@en-US[XML Binding Language (XBL) 2.0]]
( ([TIME[2007-03-16 22:20:16 +09:00]] 版))
<http://www.w3.org/TR/2007/CR-xbl-20070316/#event0>

[95] [CITE@en[Web Applications 1.0 r8375 Rearrange requirements for handling internal raw uncompiled handlers]]
( ([TIME[2014-01-07 06:35:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8374&to=8375>

[149] >>96 によって改訂されるまでは、[[イベントハンドラー内容属性]]は設定時にコンパイルが行われるようになっていました。

[50] [[スクリプトが有効]]な[[閲覧文脈]]にある [CODE(DOMi)@en[[[Document]]]]
が所有する[[要素]]の[[イベント・ハンドラー内容属性]]が設定された時、次のように処理しなければ[['''なりません'''
[SRC[>>35]]。

;; [51] そのような[[文書]]に [[adopt]] された時も同様と思われます。

[FIG(steps)[
= [52] 対応する[[イベント・ハンドラー]]を [[null]] に設定します。
= [53] [[JavaScript]] の[[スクリプト実行環境]]を準備します。
= [54] [VAR@en[body]] を[[イベント・ハンドラー内容属性]]の新しい値とします。
= [55] [VAR@en[body]] が [CODE@en[[[FunctionBody]]]] として構文解析可能でないか、
構文解析によって [[early error]] を検出した場合は、[[イベント・ハンドラー内容属性を誤りに設定]]し、
停止します。
= [56] [VAR@en[body]] が [[Use Strict Directive]] を含む [[Directive Prologue]] 
([CODE(JS)[[["use strict"]]]]) から始まるかどうかを [VAR@en[strict]] とします。
= [57] >>53 の[[スクリプト実行環境]]を使って次のような[[関数]]オブジェクトを作り、
[[スクリプト]]の [[list of code entry-points]] に入れます。
=- [77] 引数リスト [VAR[FormalParameterList]]: [CODE(DOMi)@en[[[Window]]]] の [CODE(DOMa)@en[[[onerror]]]]
[[属性]]なら [VAR[event]], [VAR[source]], [VAR[lineno]], [VAR[colno]], [VAR@en[error]] の5つ、それ以外なら
[VAR[event]] の1つ
=- [78] 関数本体 [VAR@en[FunctionBody]]: >>55 の構文解析結果
=- [79] 字句環境 [VAR@en[Scope]]: 
=-= [CODE[[VAR@en[Scope]] := [[NewObjectEnvironment]]([[要素]]の [CODE(DOMi)@en[[[Document]]]], [[大域環境]])]]
=-= [[要素]]が[[フォーム所有子]]を持つなら、 [CODE[[VAR@en[Scope]] := [[NewObjectEnvironment]]([[要素]]の[[フォーム所有子]], [VAR@en[Scope]])]]
=-= [CODE[[VAR@en[Scope]] := [[NewObjectEnvironment]]([[要素]], [VAR@en[Scope]])]]
=- [80] [VAR@en[Strict]]: >>56 の [VAR@en[strict]]
= [58] [[スクリプトの大域オブジェクト]]、[[スクリプトの閲覧文脈]]、
[[スクリプトの文書]]、[[スクリプトの参照元情報源]]、[[スクリプトのURL文字符号化]]、
[[スクリプトの基底URL]]を当該[[要素]]による[[節点からスクリプト設定の決定]]により設定します。
= [59] 対応する[[イベント・ハンドラー]]を >>57 の[[関数]]とします。
]FIG]

[60] [DFN[[RUBYB[[[イベント・ハンドラー内容属性を誤りに設定]]]@en[set the event handler content attribute to an error]]]]するとは、対応する[[イベント・ハンドラー]]を[DFN[[RUBYB[[[内部誤り値]]]@en[internal error value]]]]に設定することをいいます。
[[内部誤り値]]は[RUBYB[誤り条件]@en[error condition]]を表現するもので、
[[イベント・ハンドラー内容属性]]が設定された[[資源]]の [[URL]] や[[行番号]]を記録するものです。 [SRC[>>35]]

** 再定義

[REFS[
- [96] [CITE@en[Web Applications 1.0 r8376     Make content attribute event handlers work slightly more like in more browsers.]]
( ([TIME[2014-01-07 07:10:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8375&to=8376>
]REFS]

[150] >>96 によって[[イベントハンドラー内容属性]]のコンパイルは初めて呼び出された時まで遅延されるようになりました。

[REFS[
- [153] [CITE@en[Web Applications 1.0 r8595     Try to make event handler scope chains more accurate.]] ([TIME[2014-05-02 05:24:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=8594&to=8595>
]REFS]

[154] [CITE@en[Re: Spec for ''''''[''''''Global'''''']'''''' does not seem to be quite web-compatible, and  none of the UAs are really compatible with each other]]
( ([[Boris Zbarsky]] 著, [TIME[2013-12-27 23:49:53 +09:00]] 版))
<http://lists.w3.org/Archives/Public/public-script-coord/2013OctDec/0416.html>

[155] [CITE[The "initialization" steps for Web browsers]]
( ([TIME[2014-07-22 23:21:31 +09:00]] 版))
<https://mail.mozilla.org/pipermail/es-discuss/2014-July/038426.html>

[156] [CITE@en-US[svg2: changeset 698:568ea4166630]]
( ([TIME[2014-08-24 09:53:39 +09:00]] 版))
<https://dvcs.w3.org/hg/svg2/rev/568ea4166630b31bb0e5c7024493f127e4aa664f>

[157] [CITE@en[911477 – Implement DOM4 methods: prepend(), append(), before(), after() and replace()]]
( ([TIME[2014-09-30 04:33:23 +09:00]] 版))
<https://bugzilla.mozilla.org/show_bug.cgi?id=911477>

[158] [CITE@en[Add on* attributes · e793402 · whatwg/notifications]]
( ([TIME[2014-10-10 02:55:11 +09:00]] 版))
<https://github.com/whatwg/notifications/commit/e793402a13e125a865f5a6a053d4cfd03c242193>

[102] [CITE@en[Web Applications 1.0 r8880 Fix callback logic to reference Web IDL and use the right conventions.]]
([TIME[2015-01-16 05:52:00 +09:00]] 版)
<https://html5.org/r/8880>

[103] [CITE@en[Pointer Events]]
([TIME[2015-02-26 17:42:09 +09:00]] 版)
<https://dvcs.w3.org/hg/pointerevents/raw-file/tip/pointerEvents.html#h-extensions-to-the-element-interface>

[104] [CITE@en[Pointer Events]]
([TIME[2015-02-26 17:42:09 +09:00]] 版)
<https://dvcs.w3.org/hg/pointerevents/raw-file/tip/pointerEvents.html#h-extensions-to-the-element-interface>

[110] [CITE@en[Bug 20713 – Consider defining window.event and Event.srcElement]]
([TIME[2015-07-07 11:47:48 +09:00]] 版)
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=20713>

[111] [CITE@en[Define the ontouch* event handler attributes · Issue #11 · w3c/touch-events]]
([TIME[2015-08-28 15:17:56 +09:00]] 版)
<https://github.com/w3c/touch-events/issues/11>

[113] [CITE@en[Clarify some wording around event handlers · whatwg/html@434cbda]]
([TIME[2015-12-01 11:55:47 +09:00]] 版)
<https://github.com/whatwg/html/commit/434cbda5377f6ce3debbeb05104ba94a0eee75da>

[121] [CITE@en[Update ECMAScript and IDL integration · whatwg/html@550c57f]]
([TIME[2015-12-03 15:06:17 +09:00]] 版)
<https://github.com/whatwg/html/commit/550c57f186dd73784a8e4660440db2f642e37c0e>

[123] [CITE@en[Revert "Update ECMAScript and IDL integration" · whatwg/html@3a23548]]
([TIME[2015-12-03 15:27:42 +09:00]] 版)
<https://github.com/whatwg/html/commit/3a235480f1979fcddc65e07fe5a3be7bed428d17>

[159] [CITE@en[Close #384: add CSP hooks to handle inline events and style · whatwg/html@920c918]]
([TIME[2015-12-15 20:09:04 +09:00]] 版)
<https://github.com/whatwg/html/commit/920c9183a7990968ecac1aeedae22391f3438791>

[162] [CITE@en[Update ECMAScript and IDL integration · whatwg/html@52f96c4]]
([TIME[2015-12-16 12:27:55 +09:00]] 版)
<https://github.com/whatwg/html/commit/52f96c455a53763a7fe00162c067da6adb20e62c>

[163] [CITE@en[Rewrite script execution on top of ES · whatwg/html@4891d18]]
([TIME[2015-12-23 00:56:38 +09:00]] 版)
<https://github.com/whatwg/html/commit/4891d18aaf2df1d40aa61f467a5a10cfc19dd85d>

[FIG(quote)[
[FIGCAPTION[
[164] [CITE[+ JavaScript の質問用スレッド vol.67 +]]
([TIME[2015-12-24 23:22:11 +09:00]] 版)
<http://pc11.2ch.net/test/read.cgi/hp/1223618153/474>
]FIGCAPTION]

> IE6とOpera9では動いたのですが 
> FireFox3.0.4でうまく動きません 
> 何か間違ってるのでしょうか? 
> <form method="post"> 
> <a href="" onclick="submit(); return false;">hoge</a> 
> </form> 

]FIG]


[165] [CITE@en[Report errors to developer consoles, not users · whatwg/html@a6d04ea]]
([TIME[2015-12-25 11:49:26 +09:00]] 版)
<https://github.com/whatwg/html/commit/a6d04ea7652f5ad1b61e4ab95de490f51511bffe>

[136] [CITE@en[Add <script type="module"> and module resolution/fetching/evaluation · whatwg/html@cd1a9fb]] ([TIME[2016-01-29 22:49:02 +09:00]] 版) <https://github.com/whatwg/html/commit/cd1a9fb1e83f7d0bc30be8b34ecdaf444a0b19a4>

[166] [CITE@en[Adding event handler attributes cut/copy/paste · whatwg/html@efe130a]]
([TIME[2016-02-24 18:35:47 +09:00]] 版)
<https://github.com/whatwg/html/commit/efe130a0566a43067659c1d92bf712b151db0727>

[167] [CITE@en[Remove capture from event handler attributes as it is false by default · whatwg/html@096661f]]
([TIME[2016-03-02 15:21:32 +09:00]] 版)
<https://github.com/whatwg/html/commit/096661f04d071933a79533089d82c316eff6509a>

[168] [CITE@en[Clarify settings object, realm, and global relationships · whatwg/html@0866f1b]]
([TIME[2016-03-28 00:35:04 +09:00]] 版)
<https://github.com/whatwg/html/commit/0866f1b3f4b4ea5a99a30909e9bbe557dea0b460>

[169] [CITE@en[Add the 'unsafe-hash-attributes' source expression. · w3c/webappsec-csp@a2bb43f]]
([TIME[2016-04-15 23:03:01 +09:00]] 版)
<https://github.com/w3c/webappsec-csp/commit/a2bb43f407949a860f027a97e232c755b51029ab>

[170] [CITE@en[Add a source argument to CSP's inline behavior algorithm · whatwg/html@e0863d9]]
([TIME[2016-04-15 23:03:57 +09:00]] 版)
<https://github.com/whatwg/html/commit/e0863d93ec8c0b48f1c44d8d81a409eb08dee28c>

[171] [CITE@en[Event handlers should return null if scripting is disabled · whatwg/html@0d634e4]]
([TIME[2016-05-01 14:09:17 +09:00]] 版)
<https://github.com/whatwg/html/commit/0d634e41ff1ab0684e0b9faa2cb7461e0db3b8a1>

[173] [CITE@en[Be more precise about nested and discarded browsing contexts]]
([[domenic]]著, [TIME[2016-07-20 22:58:49 +09:00]])
<https://github.com/whatwg/html/commit/39118df640ad4a3f03f164fb5ffe0a56316297be>

[174] [CITE@en[Spec for getter of event handler attribute has some nonsense about exceptions · Issue #1957 · whatwg/html]]
([TIME[2016-10-27 14:41:19 +09:00]])
<https://github.com/whatwg/html/issues/1957>

[175] [CITE@en[Set the Realm when compiling event handler IDL attributes]]
([[domenic]]著, [TIME[2016-11-01 07:03:03 +09:00]])
<https://github.com/whatwg/html/commit/09a8c470b84108a42c0920c2e968a1d7c20a6edd>

[185] [CITE@en[(X)HTML5 Tracking]]
([TIME[2009-09-29 23:39:41 +09:00]] 版)
<http://html5.org/tools/web-apps-tracker?from=4012&to=4013>

[186] [CITE@en[Fix onbeforeunload event handler processing]]
([[domenic]]著, [TIME[2017-02-15 05:15:01 +09:00]])
<https://github.com/whatwg/html/commit/fb7e621eab8a437df7ac524e547e31e117b7fce5>

[199] [CITE@en[Fix event callback invocation to set entry/incumbent correctly]]
([[domenic]]著, [TIME[2017-02-25 07:27:07 +09:00]])
<https://github.com/whatwg/html/commit/037f35d4a114d5543d5caa17689cbe1b095790cf>

[235] [CITE@en[Fix event handler processing algorithm special cases]]
([[domenic]]著, [TIME[2017-03-16 05:16:07 +09:00]])
<https://github.com/whatwg/html/commit/c065e991b65e10a1fc77ba77fed9f0822ff6858b>

[240] [CITE@en[Meta: export event handler <dfn>s]]
([[tobie]]著, [TIME[2017-08-20 16:14:08 +09:00]])
<https://github.com/whatwg/html/commit/d0154579f6237358a7a642ae59b894e9116c4fbd>

[241] [CITE@en[Meta: export event handler DFNs. by tobie · Pull Request #2936 · whatwg/html]]
([TIME[2017-08-21 10:38:17 +09:00]])
<https://github.com/whatwg/html/pull/2936>

[242] [CITE@en[Move EventHandler to DOM spec · Issue #509 · whatwg/dom]]
([TIME[2017-10-17 17:33:50 +09:00]])
<https://github.com/whatwg/dom/issues/509>

[243] [CITE@en[Editorial: Cut dev-edition event-handler “must”s]]
([[sideshowbarker]]著, [TIME[2017-10-28 19:04:00 +09:00]])
<https://github.com/whatwg/html/commit/d4d1178845e17721b21ff6fd242b0be78a3de9a0>

[244] [CITE@en[Editorial: Cut event-handler “must”s in dev edition by sideshowbarker · Pull Request #3170 · whatwg/html]]
([TIME[2017-10-30 14:09:15 +09:00]])
<https://github.com/whatwg/html/pull/3170>

[245] [CITE@en[DOM handler and import · Issue #32 · tc39/proposal-dynamic-import]]
([TIME[2017-12-21 17:57:57 +09:00]])
<https://github.com/tc39/proposal-dynamic-import/issues/32>

[FIG(quote)[
[FIGCAPTION[
[246] [CITE@en[AMP HTML Specification – AMP]]
([TIME[2018-02-14 10:04:22 +09:00]])
<https://www.ampproject.org/docs/reference/spec>
]FIGCAPTION]

> Attribute names starting with on (such as onclick or onmouseover) are disallowed in AMP HTML. The attribute with the literal name on (no suffix) is allowed.
> 

]FIG]


[247] [CITE@en[Editorial: add "add an event listener" hook]]
([[annevk]]著, [TIME[2018-03-14 17:40:36 +09:00]])
<https://github.com/whatwg/dom/commit/2bdabb15de8112d9783cf393a3d6c37911149f77>

[248] [CITE@en[Editorial: add "add an event listener" hook by annevk · Pull Request #596 · whatwg/dom]]
([TIME[2018-03-18 00:15:44 +09:00]])
<https://github.com/whatwg/dom/pull/596>

[249] [CITE@en[Make event handlers share a code path with addEventListener()]]
([[annevk]]著, [TIME[2018-03-14 17:42:19 +09:00]])
<https://github.com/whatwg/html/commit/9a2a66cd8f8ddfa4c35d784bcda5c080e82aad38>

[250] [CITE@en[Make event handlers share a code path with addEventListener() by annevk · Pull Request #3561 · whatwg/html]]
([TIME[2018-03-18 00:21:24 +09:00]])
<https://github.com/whatwg/html/pull/3561>

[251] [CITE@en[Standardize window.event]]
([[miketaylr]]著, [TIME[2018-06-07 17:15:23 +09:00]])
<https://github.com/whatwg/dom/commit/c69d7c0fb8796de884652c517825122d12901ef5>

[252] [CITE@en[Standardize srcElement, returnValue, and window.event · Issue #334 · whatwg/dom]]
([TIME[2018-06-11 23:38:38 +09:00]])
<https://github.com/whatwg/dom/issues/334>

[253] [CITE@en[Add window.event as a legacy compat requirement by miketaylr · Pull Request #407 · whatwg/dom]]
([TIME[2018-06-11 23:43:32 +09:00]])
<https://github.com/whatwg/dom/pull/407>

[254] [CITE@en[Revise event listener removal in document.open()]]
([[TimothyGu]]著, [TIME[2018-08-10 05:50:45 +09:00]])
<https://github.com/whatwg/html/commit/823f4bcb5a4d80b231c81503dbc7c71c209617e5>

[255] [CITE@en[Revise event listener removal in document.open() by TimothyGu · Pull Request #3893 · whatwg/html]]
([TIME[2018-08-14 19:44:12 +09:00]])
<https://github.com/whatwg/html/pull/3893>

[256] [CITE@en[Event-based form participation]]
([[tkent-google]]著, [TIME[2019-01-08 23:18:23 +09:00]])
<https://github.com/whatwg/html/commit/1375c0ca5dd95ecb2ae5ad1d8d7bcc9bc75981c0>

[257] [CITE@en[Always set '''[''''''['''ScriptOrModule''']'''''']''' to null for event handler functions]]
([[domenic]]著, [TIME[2019-02-09 06:47:54 +09:00]])
<https://github.com/whatwg/html/commit/1d6eb9933701ea65f7a9dd670d37a2faa17b8f12>

[259] [CITE@en[import() behaviour in event handlers is path dependent · Issue #4267 · whatwg/html]]
([TIME[2019-06-20 17:51:56 +09:00]])
<https://github.com/whatwg/html/issues/4267>

[260] [CITE@en[Handle module resolution when there is no active script by domenic · Pull Request #4181 · whatwg/html]]
([TIME[2019-06-20 17:52:43 +09:00]])
<https://github.com/whatwg/html/pull/4181>

[261] [CITE@en[Always set '''[''''''['''ScriptOrModule''']'''''']''' to null for event handler functions by domenic · Pull Request #4302 · whatwg/html]]
([TIME[2019-06-20 17:53:35 +09:00]])
<https://github.com/whatwg/html/pull/4302>

[262] [CITE@en[Add onslotchange · Issue #3487 · whatwg/html]]
([TIME[2020-05-14 13:26:30 +09:00]])
<https://github.com/whatwg/html/issues/3487>

[265] [CITE@en[Use '''[''''''['''GlobalEnv''']'''''']''' in event handler's current value]]
([[shvaikalesh]]著, [TIME[2019-07-09 03:16:03 +09:00]])
<https://github.com/whatwg/html/commit/e51cf93ad10e91d82f69a037928ae6b09969907d>

[266] [CITE@en[Event handler FunctionCreate uses an undefined variable "global environment" · Issue #2467 · whatwg/html]]
([TIME[2020-07-14 14:41:46 +09:00]])
<https://github.com/whatwg/html/issues/2467>

[267] [CITE@en[Editorial: use '''[''''''['''GlobalEnv''']'''''']''' in event handler's current value by shvaikalesh · Pull Request #4756 · whatwg/html]]
([TIME[2020-07-14 14:42:41 +09:00]])
<https://github.com/whatwg/html/pull/4756>

[268] [CITE@en[Editorial: Remove 'Strict' arg from FunctionCreate call]]
([[jmdyck]]著, [TIME[2019-06-19 14:57:02 +09:00]])
<https://github.com/whatwg/html/commit/39dd2044f5371cabf4bd9cbb1c24b5a3a08c4166>

[148] [CITE@en[Editorial: Remove 'Strict' arg from FunctionCreate call by jmdyck · Pull Request #4712 · whatwg/html]]
([TIME[2020-07-14 14:54:41 +09:00]])
<https://github.com/whatwg/html/pull/4712>