---
title: "Invokerとは？意味・読み方とInvoker Commands APIの使い方、対応ブラウザ、HTTP Invokerとの違い"
url: "https://www.issoh.co.jp/tech/details/5837/"
published: 2025-03-14
updated: 2026-10-30
categories: ["開発"]
publisher: "株式会社一創"
---

# Invokerとは？意味・読み方とInvoker Commands APIの使い方、対応ブラウザ、HTTP Invokerとの違い

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](https://en.wiktionary.org/wiki/invoker) は米音 /ɪnˈvoʊk/、英音 /ɪnˈvəʊk/ としています。Wiktionaryは名詞 invoker の語義として、次の6つを挙げています。

- 神などに助け・導きを求めて呼びかける人（例：an invoker of God’s mercy）
- 権威を引き合いに出して正当性を求める人
- 呪文で霊を呼び出す人
- ある結果を必然的に引き起こす人
- 好意的な扱いを嘆願する人
- （コンピューター）プログラムやサブルーチンを実行させるもの

Weblio英和対訳辞書の訳語は「起動者」で、ITの語義に寄った訳です。動詞の invoke は「呼び出す」、過去分詞の invoked は「呼び出された」、名詞の invocation は「呼び出し」と訳すのが技術文書では一般的です。ゲームの話題で「インヴォーカー」と出てくる場合は、Valveの対戦ゲーム [Dota 2のヒーロー](https://www.dota2.com/hero/invoker)（公式の日本語名もインヴォーカー）を指しています。公式の人物紹介では魔術師として描かれており、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との違い](/tech/details/15435/)で扱っています。

## Invoker Commands APIの仕組み：commandforとcommandの2属性

[MDNのInvoker Commands APIのページ](https://developer.mozilla.org/ja/docs/Web/API/Invoker%5FCommands%5FAPI)は、この機能（日本語版の表記は「呼び出しコマンド API」）を「ボタンに動作を宣言的に割り当てる方法」と説明しています。これまでは、ボタンにクリックのイベントリスナーを付け、その中で `dialog.showModal()` などを呼ぶ必要がありました。Invoker Commands APIでは、この対応関係をHTMLの属性で書きます。操作できる対象と命令は仕様で決まった範囲に限られます。

### commandfor属性：操作する要素をIDで指定

`commandfor` には、操作したい要素の `id` を書きます。[WHATWGのHTML仕様（button要素の節）](https://html.spec.whatwg.org/multipage/form-elements.html#attr-button-command)では、指す要素はボタンと同じツリーに無ければなりません。そのため、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要素での実装](/tech/details/7075/)で扱っています。

### ポップオーバー：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機能](/tech/details/10692/)を参照してください。

## カスタムコマンドとcommandイベントの実装

### カスタムコマンドによる独自操作の割り当て

`command` の値を `--` で始めると、ブラウザは組み込みの動作をせず、対象要素に `command` イベントだけを発行します。イベントオブジェクトは [CommandEvent](https://developer.mozilla.org/ja/docs/Web/API/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](https://webstatus.dev/features/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つのステータス・確認方法を実例で解説](/tech/details/5467/)で解説しています。「広く利用可能（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](https://github.com/keithamus/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](https://docs.spring.io/spring-framework/docs/5.3.x/javadoc-api/org/springframework/remoting/httpinvoker/HttpInvokerServiceExporter.html)では `HttpInvokerServiceExporter` に「Deprecated as of 5.3 (phasing out serialization-based remoting)」と書かれています。公式の理由は、Java直列化に頼るリモート呼び出しを段階的に廃止する方針で、6.0で `org.springframework.remoting` パッケージごと削除されました。これとは別に、同じjavadocは、細工された入力を復元するとサーバーで意図しないコードが実行されうると警告しています。NVDはこの危険を [CVE-2016-1000027](https://nvd.nist.gov/vuln/detail/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開発・システム連携の支援](/service/system/api/)のように、API設計から置き換えを進める方法もあります。Spring Frameworkの版ごとの違いは[Spring Frameworkとは？特徴・DI/AOPとSpring Bootとの違い・最新版7を解説【2026年最新】](/tech/details/3867/)にまとめています。

## よくある質問

### 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へ移行します。

## 関連記事

- [ドロワー・モーダル・ダイアログの違い｜UIの選び方とdialog要素での実装](/tech/details/7075/)
- [CSS Anchor Positioningの概要: 要素を結びつけて相対位置を制御する最新CSS機能](/tech/details/10692/)
- [Web Platform Baselineとは？対応ブラウザ・2つのステータス・確認方法を実例で解説](/tech/details/5467/)
- [Spring Frameworkとは？特徴・DI/AOPとSpring Bootとの違い・最新版7を解説【2026年最新】](/tech/details/3867/)
- [Cloud Runとは？GCPのサーバーレスコンテナの仕組み・料金とGKE/Cloud Functionsとの違いを実装者目線で解説](/tech/details/15435/)

---

出典: [Invokerとは？意味・読み方とInvoker Commands APIの使い方、対応ブラウザ、HTTP Invokerとの違い](<https://www.issoh.co.jp/tech/details/5837/>)（株式会社一創）
