invoker(インヴォーカー/インボーカー)は、invoke(呼び出す・祈り求める)に「〜する人・もの」を表す -er が付いた語です。英語では神や霊に呼びかける人を指し、ITでは「処理を呼び出す側」を指します。この記事で主に扱うのは、HTMLの button 要素に commandfor と command の2属性を書くだけで、JavaScriptなしに dialog やポップオーバーを開閉できる Invoker Commands API です。2025年12月12日のSafari 26.2で主要ブラウザがそろい、Baselineの「新たに利用可能」に入りました。この記事では、その書き方と落とし穴を中心に、Javaの Spring HTTP Invoker や Cloud Run の Invoker ロールなど、同じ語が使われる別の技術との違いも整理します。
まとめ:Invokerの意味とInvoker Commands APIの要点
- invokerの意味:呼び出す側。読みはインヴォーカー(インボーカー)。英語の辞書では「神に助けを求めて呼びかける人」「呪文で霊を呼び出す人」が並び、IT用語の語義は「プログラムやサブルーチンを実行させるもの」です。HTMLではコマンドを発行するボタン、Javaのリモート呼び出しでは呼び出しを中継する仕組みを指します。DBの
SECURITY INVOKERは呼び出した利用者の権限で実行する設定、Cloud Runのroles/run.invokerは呼び出しを許可するIAMロールです。 - Invoker Commands API:
<button commandfor="対象のid" command="show-modal">のように書くと、クリックやEnter・Spaceキーで対象要素に命令が届きます。組み込みコマンドはshow-modal・close・request-close・show-popover・hide-popover・toggle-popoverの6種で、--で始まる名前にすると独自コマンドになります。 - 対応ブラウザ:基本属性はChrome・Edge 135、Firefox 144、Safari 26.2(iOS含む)から対応します。ただし、
request-closeはChrome・Edge 139以降が必要です。これより古い版を切れない案件ではJavaScriptのフォールバックが要ります。 - フォーム内の落とし穴:
formの中に置いたボタンは、type="button"を書かないと何も起きません。Chrome 154と156で確かめたところ、どちらもダイアログも開かずフォーム送信もされませんでした。 - Spring HTTP Invoker:Java直列化でメソッドを呼び出す旧来のリモート呼び出し機構です。Spring Framework 5.3で非推奨になり、6.0で削除されました。新規採用はせず、HTTP Interface(
@HttpExchange)などへ移します。
以下、語の意味の整理から入り、Invoker Commands APIの属性・使い方・実装上の注意・対応状況、最後にSpring HTTP Invokerの順に説明します。
invokerの意味:技術ごとに異なる「呼び出す側」
invokerという語そのものは「呼び出す側」という一般名詞で、特定の製品名ではありません。英語としての意味と、ITの各技術で指すものを分けて整理します。
英語のinvokerの意味と読み方
カタカナでは「インヴォーカー」「インボーカー」と書かれ、強勢は2音節目の「ヴォ」に置かれます。元の動詞 invoke の発音を、Wiktionary は米音 /ɪnˈvoʊk/、英音 /ɪnˈvəʊk/ としています。Wiktionaryは名詞 invoker の語義として、次の6つを挙げています。
- 神などに助け・導きを求めて呼びかける人(例:an invoker of God’s mercy)
- 権威を引き合いに出して正当性を求める人
- 呪文で霊を呼び出す人
- ある結果を必然的に引き起こす人
- 好意的な扱いを嘆願する人
- (コンピューター)プログラムやサブルーチンを実行させるもの
Weblio英和対訳辞書の訳語は「起動者」で、ITの語義に寄った訳です。動詞の invoke は「呼び出す」、過去分詞の invoked は「呼び出された」、名詞の invocation は「呼び出し」と訳すのが技術文書では一般的です。ゲームの話題で「インヴォーカー」と出てくる場合は、Valveの対戦ゲーム Dota 2のヒーロー(公式の日本語名もインヴォーカー)を指しています。公式の人物紹介では魔術師として描かれており、IT用語のinvokerとは関係がありません。
IT用語のinvoker:文脈別の対応表
ITでは、同じ語でもどの技術の文脈かで指すものが変わります。検索結果で別の技術の記事に行き着くことが多いので、先に対応を示します。
| 文脈 | invokerが指すもの | 代表的な書き方 |
|---|---|---|
| HTML(Invoker Commands API) | 命令を出すボタン | commandfor・command 属性 |
| Spring Framework | HTTP経由のリモート呼び出し | HttpInvokerProxyFactoryBean(6.0で削除) |
| JBoss AS | JNDI・EJBをHTTPで中継するサービス | HTTP Invoker(http-invoker.sar) |
| Google Cloud Run | サービスを呼び出せる権限 | roles/run.invoker |
| PostgreSQL・MySQL | 呼び出した利用者の権限で実行 | SECURITY INVOKER・SQL SECURITY INVOKER |
| Snowflake | 実行オブジェクトのロール(ビューでは所有者) | INVOKER_ROLE() 関数 |
権限の文脈では「定義した人(definer)」と対になります。PostgreSQLの関数は既定が SECURITY INVOKER(呼び出した利用者の権限)で、MySQLのストアドルーチンとビューは SQL SECURITY を省略すると定義者の権限で動きます。PostgreSQLのビューに security_invoker オプションが加わったのは15からです。Cloud Runの roles/run.invoker は、公式の説明で「Cloud Runのサービスとインスタンスを呼び出し、ジョブを実行できる」ロールとされています。サービスの構成はCloud Runとは?GCPのサーバーレスコンテナの仕組み・料金とGKE/Cloud Functionsとの違いで扱っています。
Invoker Commands APIの仕組み:commandforとcommandの2属性
MDNのInvoker Commands APIのページは、この機能(日本語版の表記は「呼び出しコマンド API」)を「ボタンに動作を宣言的に割り当てる方法」と説明しています。これまでは、ボタンにクリックのイベントリスナーを付け、その中で dialog.showModal() などを呼ぶ必要がありました。Invoker Commands APIでは、この対応関係をHTMLの属性で書きます。操作できる対象と命令は仕様で決まった範囲に限られます。
commandfor属性:操作する要素をIDで指定
commandfor には、操作したい要素の id を書きます。WHATWGのHTML仕様(button要素の節)では、指す要素はボタンと同じツリーに無ければなりません。そのため、Shadow DOMの内側から外側の要素は指せません。JavaScriptからは commandForElement プロパティで要素そのものを代入でき、Chrome 154では button.commandForElement = dialog と代入したあとのクリックでダイアログが開きました。
この属性が効くのは button 要素だけです。div に commandfor と command を書いてクリックしても、Chrome 154と156ではダイアログは開かず、command イベントも発生しませんでした。
command属性:組み込み6コマンドとカスタムコマンド
command には次の値を書きます。組み込みコマンドは、いずれも既存のJavaScriptメソッドを宣言的に呼ぶものです。
| command の値 | 対象 | 相当する処理 |
|---|---|---|
show-modal |
dialog |
showModal() |
close |
dialog |
close() |
request-close |
dialog |
requestClose() |
show-popover |
popover要素 | showPopover() |
hide-popover |
popover要素 | hidePopover() |
toggle-popover |
popover要素 | togglePopover() |
-- で始まる任意名 |
任意の要素 | command イベントの発行のみ |
この7種に当てはまらない値は仕様上「不明」扱いになり、何も起きません。Chrome 154と156で command="unknown" と書いたボタンは、クリックしても何もせず、button.command を読むと空文字列が返りました。綴りを間違えても、エラーは出ずに無反応になるだけです。動かないときは、まずこのプロパティの値を確認してください。
Invoker Commands APIの使い方:dialogとpopoverをJSなしで開閉
よく使うのはモーダルダイアログとポップオーバーの開閉です。どちらも、これまで数行のJavaScriptで書いていた処理がHTMLの属性だけで済みます。
モーダルダイアログ:show-modal・close・request-close
<button type="button" commandfor="confirm" command="show-modal">削除する</button>
<dialog id="confirm" aria-labelledby="confirm-title">
<p id="confirm-title">本当に削除しますか?</p>
<button type="button" commandfor="confirm" command="close" value="cancel">やめる</button>
<button type="button" commandfor="confirm" command="close" value="ok">削除</button>
</dialog>
<script>
document.getElementById("confirm").addEventListener("close", (e) => {
const confirmed = e.target.returnValue === "ok";
e.target.returnValue = "";
if (confirmed) {
// 削除処理
}
});
</script>
close のボタンに value を付けると、その値がダイアログの returnValue に入ります。Chrome 154と156で value="ok" のボタンで閉じると、close イベント時点の returnValue は ok でした。どのボタンで閉じたかを判定する処理は、ここだけをJavaScriptで書けば済みます。returnValue は次に開いたときも前回の値が残るため、上の例では読み取ったあとに空文字列へ戻しています。
request-close は、閉じる前に cancel イベントを発行します。未保存の入力があるときに cancel で preventDefault() を呼べば、閉じるのを止められます。Chrome 154では、preventDefault() したときはダイアログが開いたままで、しなかったときは cancel → close の順にイベントが発生し、returnValue にボタンの値 rq が入りました。close コマンドは cancel を経由しないため、cancelイベントでは阻止できません。止めたい場合は、その前に発生する command イベントで preventDefault() を呼びます。モーダル・ドロワーとの使い分けとdialog要素そのものの実装は、ドロワー・モーダル・ダイアログの違い|UIの選び方とdialog要素での実装で扱っています。
ポップオーバー:toggle-popoverとpopovertargetの関係
<button type="button" commandfor="menu" command="toggle-popover">メニュー</button>
<div id="menu" popover>
<a href="/settings">設定</a>
<button type="button" commandfor="menu" command="hide-popover">閉じる</button>
</div>
ポップオーバーは以前から popovertarget 属性でも開閉でき、MDNは commandfor を「popovertarget をより汎用にしたもの」と位置づけています。toggle-popover は popovertargetaction="toggle" と同じ動作です。既存の popovertarget を急いで書き換える必要はありません。ただし、ダイアログとポップオーバーを同じ書き方にそろえられる点では commandfor が有利です。なお、popovertarget でつないだボタンとポップオーバーには、aria-expanded などの関係やCSSアンカーの暗黙の参照が自動で付くとMDNに記載があります。browser-compat-dataでは commandfor にも暗黙のアンカー参照があり、対応はChrome 135・Safari 26.2・Firefox 147からです。ボタンの位置にポップオーバーを添わせる方法はCSS Anchor Positioningの概要: 要素を結びつけて相対位置を制御する最新CSS機能を参照してください。
カスタムコマンドとcommandイベントの実装
カスタムコマンドによる独自操作の割り当て
command の値を -- で始めると、ブラウザは組み込みの動作をせず、対象要素に command イベントだけを発行します。イベントオブジェクトは CommandEvent で、command にコマンド名、source に押されたボタンが入ります。
<button type="button" commandfor="photo" command="--rotate-left">左に回転</button>
<button type="button" commandfor="photo" command="--rotate-right">右に回転</button>
<img id="photo" src="/images/sample.png" alt="サンプル画像">
<script>
const photo = document.getElementById("photo");
let deg = 0;
photo.addEventListener("command", (e) => {
if (e.command === "--rotate-left") deg -= 90;
if (e.command === "--rotate-right") deg += 90;
photo.style.rotate = `${deg}deg`;
console.log("押されたボタン:", e.source.textContent);
});
</script>
ボタンごとにクリックのリスナーを付ける書き方と比べると、リスナーが操作される側の要素1か所にまとまります。既存の左右回転コマンドを呼ぶボタンなら、HTMLに1行足すだけで増やせます。新しい操作を追加する場合は、イベントリスナー側にも処理を追加します。
command イベントは組み込みコマンドでも発生し、仕様上 cancelable です。Chrome 154と156でダイアログの command イベントで preventDefault() を呼ぶと、show-modal のボタンを押してもダイアログは開きませんでした。「条件を満たすまで開かせない」といった制御は、この段階で入れられます。
commandイベントの非バブリングとキャプチャによる一括処理
click と違い、command イベントはバブリングしません。ただし、祖先要素のキャプチャリスナーでは受け取れます。仕様は cancelable だけを true にして対象要素で発火すると定めており、bubbles は false のままです。Chrome 156で確かめたところ、e.bubbles は false で、対象の親要素や document に第3引数なし(バブリング段階)で付けたリスナーは何も受け取りませんでした。
画面内の多数の要素のカスタムコマンドを1か所で処理したい場合は、document にキャプチャ指定(第3引数 true)でリスナーを付けます。Chrome 156では、この書き方で組み込みコマンドとカスタムコマンドの両方を受け取れました。
// command はバブリングしないため、document のリスナーにはキャプチャを指定する
document.addEventListener("command", (e) => {
if (!e.command.startsWith("--")) return; // 組み込みコマンドは処理しない
console.log(e.command, "→", e.target.id, "(押されたボタン:", e.source.id, ")");
}, true);
ボタンのクリックをイベント委譲で拾っていた既存のコードを command イベントに置き換えるときに、キャプチャを付け忘れると無反応になります。
実装時の落とし穴:form内のボタンと無効なターゲット
Invoker Commands APIは失敗してもエラーを出しません。動かないときに原因を見つけにくいので、Chrome 154.0.8037.58(2026年9月30日)とChrome 156.0.8078.76(2026年10月30日)で挙動を確かめた結果を示します。6項目とも両方の版で同じ結果でした(検証スクリプトと出力は社内に保存しています)。
| 条件 | 結果(Chrome 154・156) |
|---|---|
| form内・type属性なし | 開かない・送信もされない |
| form内・type=”button” | モーダルで開く |
| form内・type=”submit” | 送信のみ・開かない |
| divに show-modal | 何も起きない・イベントなし |
| popover属性のない要素に show-popover | イベントは届く・表示されない |
| 存在しないidを指定 | 何も起きない |
1行目は、type属性の省略による無反応です。WHATWGのHTML仕様では、type 属性を省略したボタンは「Auto」状態になり、command と commandfor があると送信ボタンとして扱われません。一方、仕様上フォームに属するボタンは、Auto状態のままだと何もせずに処理を終えます。検索フォームの横に「詳細条件」ダイアログのボタンを置くような画面では、この無反応に行き当たります。Invoker Commands APIのボタンには、form内かどうかにかかわらず type="button" を必ず書く、と決めておけば避けられます。
5行目は、仕様が「要素の状態は見ずに、要素の種類だけでイベントを出すか決める」と定めているためです。ポップオーバー系のコマンドはすべてのHTML要素に対して有効と判定されるので、popover 属性を付け忘れてもイベントは届きます。しかし表示はされません。イベントのログが出ているのに表示されない場合は、対象要素の属性を疑ってください。
対応ブラウザとBaseline:Chrome 135・Firefox 144・Safari 26.2
web-featuresのデータ(webstatus.devのinvoker-commands)による基本属性の対応状況は次のとおりです。個別コマンドの対応開始は異なり、request-close にはChrome・Edge 139以降が必要です。最後にSafariが対応した2025年12月12日に、Baselineの「新たに利用可能(Newly available)」になりました。
| ブラウザ | 対応版 | リリース日 |
|---|---|---|
| Chrome(Android含む) | 135 | 2025-04-01 |
| Edge | 135 | 2025-04-04 |
| Firefox(Android含む) | 144 | 2025-10-14 |
| Safari(iOS含む) | 26.2 | 2025-12-12 |
Baselineの2つのステータスの意味はWeb Platform Baselineとは?対応ブラウザ・2つのステータス・確認方法を実例で解説で解説しています。「広く利用可能(Widely available)」になるのは、Newlyから30か月後です。
採用前には、対象ユーザーのブラウザとOSの更新状況を確認します。一般向けサイトでは、特にiOSの更新状況を確認してください。iPhoneのSafariはOSと一緒に更新されるため、iOS 26.2未満の端末ではボタンが無反応になります。業務システムのように対象ブラウザを最新版に限定できる画面なら、そのまま使ってかまいません。一般向けのサイトで、ダイアログを開けないと購入や申し込みが完了しない導線には、フォールバックなしで使うべきではありません。対策は次の2通りです。
'command' in HTMLButtonElement.prototypeで基本属性の対応を検出し、未対応時にクリックリスナーを付ける(Chrome 154・156ではこの式がtrueを返すことを確認済み)。request-closeを使う場合は、作成したボタンのcommandプロパティにrequest-closeを代入し、読み戻して同じ値になるかも確かめる。未知の値を代入すると空文字列が返るためです- npmの invokers-polyfill(2026年10月30日時点の最新は2026年8月20日公開の1.0.4)を読み込み、未対応ブラウザでも同じ属性で動かす。ただし、公式READMEではaria-expandedなどの状態をネイティブ実装と同様には処理しない制限が示されているため、必要なARIA状態は実装側で管理する
なお、button 要素には、ホバーやフォーカスでポップオーバーを出す interestfor 属性も提案されています。browser-compat-data(2026年10月30日時点)ではChrome・Edge 142が実装済み、FirefoxとSafariは未対応で、実験的かつ非標準の扱いです。Invoker Commands APIとは別の機能なので、一般向けの画面ではまだ前提にできません。
Spring HTTP Invokerとは:廃止されたJavaのリモート呼び出し
「http invoker」「spring http invoker」で調べている場合は、Javaの話です。Spring HTTP Invokerは、別サーバーにあるJavaオブジェクトのメソッドを、ローカルのメソッドのように呼び出すためのSpring Frameworkの機能でした。
HttpInvokerServiceExporterとProxyFactoryBeanの仕組み
サーバー側は HttpInvokerServiceExporter でサービスのBeanを公開し、クライアント側は HttpInvokerProxyFactoryBean が作るプロキシ経由でメソッドを呼びます。引数と戻り値はJava標準の直列化(Serializable)でバイト列にされ、HTTPのPOSTで送られます。RMIと違って通常のHTTPポートを通るため、ファイアウォール越しでも使いやすいのが利点でした。
5.3で非推奨・6.0で削除された理由と移行先
Spring Framework 5.3のjavadocでは HttpInvokerServiceExporter に「Deprecated as of 5.3 (phasing out serialization-based remoting)」と書かれています。公式の理由は、Java直列化に頼るリモート呼び出しを段階的に廃止する方針で、6.0で org.springframework.remoting パッケージごと削除されました。これとは別に、同じjavadocは、細工された入力を復元するとサーバーで意図しないコードが実行されうると警告しています。NVDはこの危険を CVE-2016-1000027(NVDの評価でCVSS 3.1の9.8)として登録しており、Spring側は「信頼できないデータの復元は想定用途ではない」として動作を変えない立場です。
JBoss ASの「HTTP Invoker」も同じ構造の問題を抱えていました。JNDIやEJBの呼び出しをHTTPで中継するサービスですが、CVE-2017-12149ではその ReadOnlyAccessFilter が直列化データを無制限に復元する点が指摘されています。該当するJBoss環境では、Red Hatが案内するHTTP Invoker全体へのアクセス制限、または未使用のHTTP Invokerの撤去で対処します。
いまもHTTP Invokerが動いているシステムは、Spring Framework 6以降へ上げる前に置き換えが必要です。同じ「インターフェースを呼ぶだけ」の書き心地を保つなら、Spring 6で入ったHTTP Interface(@HttpExchange を付けたJavaインターフェース)が候補です。HTTP InterfaceはHTTP通信をJavaインターフェースで記述する仕組みで、通信形式が自動的にJSONへ変わるわけではありません。移行時はサーバー側にもHTTP APIを実装し、JSONなどの通信形式とURL・HTTPメソッドを定義する必要があります。呼び出し元が複数のシステムにまたがる場合は、API開発・システム連携の支援のように、API設計から置き換えを進める方法もあります。Spring Frameworkの版ごとの違いはSpring Frameworkとは?特徴・DI/AOPとSpring Bootとの違い・最新版7を解説【2026年最新】にまとめています。
よくある質問
invokerの読み方と意味は?
インヴォーカー(インボーカー)と読み、強勢は「ヴォ」に置きます。invoke(呼び出す・祈り求める)に -er が付いた語で、英語では「神に助けを求めて呼びかける人」「呪文で霊を呼び出す人」、ITでは「処理を呼び出す側」を指します。HTMLではコマンドを発行するボタンのことです。DBの SECURITY INVOKER は呼び出した利用者の権限で実行する設定、Cloud Runの roles/run.invoker は呼び出しを許可するIAMロールを表します。
Invoker Commands APIはJavaScriptなしで使えますか?
組み込みの6コマンド(show-modal・close・request-close・show-popover・hide-popover・toggle-popover)はHTMLの属性だけで動きます。-- で始まるカスタムコマンドは command イベントを受け取る処理をJavaScriptで書く必要があります。
commandforを書いたボタンを押しても何も起きないのはなぜですか?
まず確認したいのは、form内のボタンに type="button" があるかです。ほかに、command の綴り間違い(button.command が空文字列になる)、対象のidの誤り、button 以外の要素に属性を書いているケースがあります。
popovertargetとcommandforはどちらを使うべきですか?
ポップオーバーだけならどちらでも同じように動きます。ダイアログも同じ書き方で扱いたい場合や、command イベントで処理を差し込みたい場合は commandfor を選びます。既存の popovertarget を無理に書き換える必要はありません。
Spring HTTP Invokerはまだ使えますか?
Spring Framework 5.3までは非推奨のまま残っていますが、6.0で削除されました。Spring Boot 3以降(Spring Framework 6以降)では使えないため、HTTP InterfaceによるREST呼び出しやgRPCへ移行します。