[2] [DFN[[RUBYB[コールバックインターフェイス]@en[callback interface]]]]は、[[コールバック関数]]と似ていますが、
[[定数]]を持つ[[インターフェイス]]でもあるものです。

[3] [[著者]]にとっては、[[コールバック関数]]と同じように [[JavaScript]]
[CODE(JS)@en[[[Function]]]] を[[コールバックインターフェイス]]型の値として使うことができます。
[[Webブラウザー]]にとっては、それに加えて[[インターフェイスオブジェクト]]で[[定数]]を[[スクリプト]]に提供する必要があります。

* 代替

[4] [[コールバックインターフェイス]]は旧時代の [[W3C DOM]] との互換性のために用意されているもので、
現在では新たに定義するべきではないと考えられています。

* 一覧

[1] [[コールバックインターフェイス]]には、次のものがあります。

[FIG(list short)[
- [CODE(DOMi)@en[[[EventListener]]]]
- [CODE(DOMi)@en[[[NodeFilter]]]]
- [CODE[XPathNSResolver]]
]FIG]

[10] [CODE[NodeFilter]] はいくつか[[定数]]を定義しています。
[[大域オブジェクト]] [CODE[Window]] に[[遺物コールバックインターフェイスオブジェクト]]が[[晒され]]ているので、
[CODE(JS)[[[window]].[[NodeFilter]]]] のようにアクセスできます。

[11] 
[CODE[EventListener]] と
[CODE[XPathNSResolver]]
は[[定数]]がなく、何も[[晒され]]ていません。
[[利用者オブジェクト]]として使うことができるのみで、
[[プラットフォームオブジェクト]]として[[観測可能]]なものはありません。

;; [15] [CODE[XPathNSResolver]] は[[演算名]]が
[CODE[Node]] [[インターフェイス]]と揃えられていました。
[CODE[Node]] をそのまま [CODE[XPathNSResolver]]
として使えることが想定されたものでした。

[HISTORY[
[20] ほかにもいくつかの[[コールバック関数]]は、
[[コールバックインターフェイス]]でした。
互換性のために必要なものを除き、
新設された[[コールバック関数]]に切り替えられました。
]HISTORY]

* 実現値

[5] [[コールバックインターフェイス]]は、[[利用者オブジェクト]]が[[実装]]できます。
[[プラットフォームオブジェクト]]は[[実装]]できません。つまり、
[[著者]]は[[コールバックインターフェイス]]を[[実装]]した[[オブジェクト]]を作成できますが、
[[利用者エージェント]]は作成できません。

* 歴史

[6] [CITE@en[Callback interface prototype should be Function.prototype, not Object…]]
([[ayg]]著, [TIME[2016-08-29 22:42:20 +09:00]])
<https://github.com/heycam/webidl/commit/6b0eb63d6cba3ff1f90f4ef3e733749ff51751a0>

[7] [CITE@en[Revamp interface bindings (#313)]]
([[tobie]]著, [TIME[2017-02-21 07:17:07 +09:00]])
<https://github.com/heycam/webidl/commit/4a8f57e276369db7ea5fb09974a09b0ca5d276dd>

[8] [CITE@en[Stop claiming callback interfaces are interfaces]]
([[Ms2ger]]著, [TIME[2019-04-04 22:16:59 +09:00]])
<https://github.com/heycam/webidl/commit/b8ff6b125db0059ad015643074a4b80cae2b6063>

[9] [CITE@en[Stop claiming callback interfaces are interfaces by Ms2ger · Pull Request #705 · heycam/webidl]]
([TIME[2020-01-12 12:24:53 +09:00]])
<https://github.com/heycam/webidl/pull/705>

[12] [CITE@en[Remove unused callback interface functionality]]
([[Ms2ger]]著, [TIME[2019-03-25 18:47:19 +09:00]])
<https://github.com/heycam/webidl/commit/8f762224f688f0cf61e62cfe220b597878c2ef24>

[13] [CITE@en[Remove unused callback interface functionality by Ms2ger · Pull Request #696 · heycam/webidl]]
([TIME[2020-01-12 13:32:49 +09:00]])
<https://github.com/heycam/webidl/pull/696>

[14] [CITE@en[Should callback interfaces with more than one operation be supported? · Issue #661 · heycam/webidl]]
([TIME[2020-01-12 13:33:04 +09:00]])
<https://github.com/heycam/webidl/issues/661>

[16] [CITE@en[Should callback interfaces with more than one operation be supported? · Issue #661 · heycam/webidl]]
([TIME[2020-01-12 13:37:14 +09:00]])
<https://github.com/heycam/webidl/issues/661>

[17] [CITE@en[Fix the grammar for CallbackInterfaceMembers. (#753)]]
([[Ms2ger]]著, [TIME[2019-07-02 02:04:28 +09:00]])
<https://github.com/heycam/webidl/commit/15563ce1568480425da51830cf1ae2b3773e6709>

[18] [CITE@en[Fix the grammar for CallbackInterfaceMembers. by Ms2ger · Pull Request #753 · heycam/webidl]]
([TIME[2020-01-12 15:19:40 +09:00]])
<https://github.com/heycam/webidl/pull/753>

[19] [CITE@en[CallbackInterfaceMembers grammar question (typo?) · Issue #751 · heycam/webidl]]
([TIME[2020-01-12 15:19:52 +09:00]])
<https://github.com/heycam/webidl/issues/751>