カテゴリ: JavaScript 更新日: 2026/08/05

JavaScriptでブラウザのタブ間通信を完全解説!初心者向けBroadcastChannel API入門

JavaScriptでブラウザのタブ間通信を行う方法(BroadcastChannel APIなど)
JavaScriptでブラウザのタブ間通信を行う方法(BroadcastChannel APIなど)

先生と生徒の会話形式で理解しよう

生徒

「先生、同じウェブサイトの別のタブと情報をやり取りする方法ってありますか?」

先生

「ありますよ。JavaScriptではBroadcastChannel APIを使うと簡単にタブ間で通信ができます。」

生徒

「BroadcastChannel APIって難しそうです。簡単に使える方法はありますか?」

先生

「大丈夫です。基本を押さえればすぐに使えます。順を追って説明しますね。」

1. タブ間通信とは?

1. タブ間通信とは?
1. タブ間通信とは?

ブラウザで複数のタブを開いたとき、あるタブで操作した内容を別のタブに知らせたいことがあります。例えば、ユーザーがログイン状態を別タブでも同期したい場合などです。このように、異なるタブ間で情報をやり取りすることを「タブ間通信」と呼びます。

2. BroadcastChannel APIの基本

2. BroadcastChannel APIの基本
2. BroadcastChannel APIの基本

BroadcastChannel APIは、同じオリジン(同じウェブサイト)内のタブ同士で簡単にメッセージを送受信できる仕組みです。従来はlocalStorageServiceWorkerを使った方法もありましたが、BroadcastChannelはより直感的で初心者向けです。


const channel = new BroadcastChannel('my_channel');

channel.postMessage('こんにちは、他のタブ!');

上記の例では「my_channel」という名前のチャンネルを作り、メッセージを送信しています。

3. タブでメッセージを受け取る方法

3. タブでメッセージを受け取る方法
3. タブでメッセージを受け取る方法

タブ側ではonmessageイベントを使ってメッセージを受け取ります。


const channel = new BroadcastChannel('my_channel');

channel.onmessage = (event) => {
  console.log('受信したメッセージ:', event.data);
};

別のタブでpostMessageした内容が、このonmessageに届きます。

4. 簡単なチャット例

4. 簡単なチャット例
4. 簡単なチャット例

タブ間通信を使って簡単なチャットを作ることもできます。ユーザーが入力したメッセージをすべてのタブに表示する例です。


const chatChannel = new BroadcastChannel('chat');

function sendMessage(msg) {
  chatChannel.postMessage(msg);
}

chatChannel.onmessage = (event) => {
  const chatBox = document.getElementById('chatBox');
  chatBox.innerHTML += '<p>' + event.data + '</p>';
};

これで、どのタブでメッセージを送っても他のタブに表示されます。

5. タブ間通信の注意点

5. タブ間通信の注意点
5. タブ間通信の注意点

BroadcastChannel APIは同じオリジン内でのみ通信可能です。また、古いブラウザではサポートされていない場合があります。その場合はlocalStoragestorageイベントを代替手段として使うことも可能です。


window.addEventListener('storage', (event) => {
  if (event.key === 'chatMsg') {
    console.log('storageイベントで受信:', event.newValue);
  }
});

// メッセージ送信
localStorage.setItem('chatMsg', 'こんにちは、タブ!');

6. タブが閉じられたときの処理

6. タブが閉じられたときの処理
6. タブが閉じられたときの処理

タブを閉じるとBroadcastChannelも自動的に閉じられますが、明示的にclose()を呼ぶことでメモリの解放やイベント停止ができます。


const channel = new BroadcastChannel('my_channel');

// タブを閉じる前にチャンネルを閉じる
window.addEventListener('beforeunload', () => {
  channel.close();
});

これにより、不要な通信やリソース消費を防ぐことができます。

7. 実用例: フォーム入力のリアルタイム同期

7. 実用例: フォーム入力のリアルタイム同期
7. 実用例: フォーム入力のリアルタイム同期

複数タブで同じフォームを開いている場合、入力内容をリアルタイムで同期することも可能です。例えば、ユーザー名の入力をすべてのタブで表示する例です。


const formChannel = new BroadcastChannel('form_sync');

const nameInput = document.getElementById('username');
nameInput.addEventListener('input', () => {
  formChannel.postMessage(nameInput.value);
});

formChannel.onmessage = (event) => {
  nameInput.value = event.data;
};

これで、どのタブでも同じ入力内容がすぐに反映されます。

8. まとめと応用ポイント

8. まとめと応用ポイント
8. まとめと応用ポイント

BroadcastChannel APIはシンプルで直感的にタブ間通信ができるため、ログイン状態の同期やチャット、フォーム同期などに活用できます。初心者でも基本のpostMessageonmessageさえ理解すれば、すぐに実装可能です。また、古いブラウザや互換性の問題がある場合はlocalStorageイベントを併用することで安全に通信できます。

ポイントは次の通りです:

  • 同じオリジン内で通信可能
  • postMessageで送信、onmessageで受信
  • タブ閉鎖時はclose()でリソース解放
  • 古いブラウザではlocalStorageイベントを代替手段として使用

まとめ

まとめ
まとめ

本記事では、JavaScriptのBroadcastChannel APIを使ったブラウザのタブ間通信について詳しく解説しました。タブ間通信とは、同じウェブサイトの複数のタブ間で情報をリアルタイムにやり取りする仕組みで、ユーザーの操作や入力内容を別タブでも同期させることができます。従来はlocalStoragestorageイベントやServiceWorkerを用いた方法もありましたが、BroadcastChannel APIはより直感的で初心者でも理解しやすく、ログイン状態の共有、チャット機能、フォーム入力のリアルタイム同期など幅広い用途で活用できます。 実装の基本は非常にシンプルで、まずBroadcastChannelオブジェクトを作成し、postMessageでメッセージを送信、onmessageで受信するだけです。さらに、タブを閉じる際にはclose()でチャンネルを明示的に閉じることでメモリリークや不要な通信を防げます。古いブラウザや互換性の問題がある場合は、localStorageイベントを補助的に使うことで安全にタブ間通信を実現できます。

サンプルコードでおさらい

BroadcastChannel APIを使った簡単なタブ間通信の例です。

 const channel = new BroadcastChannel('example_channel');
// メッセージ送信
channel.postMessage('タブ間通信テスト');

// メッセージ受信
channel.onmessage = (event) => {
console.log('受信したメッセージ:', event.data);
};

// タブ閉鎖時にチャンネルを閉じる
window.addEventListener('beforeunload', () => {
channel.close();
});

また、古いブラウザ向けにlocalStorageイベントを代替手段として使う例も確認しておくと便利です。


window.addEventListener('storage', (event) => {
if (event.key === 'chatMsg') {
console.log('storageイベントで受信:', event.newValue);
}
});

// メッセージ送信
localStorage.setItem('chatMsg', 'こんにちは、タブ!');

このようにBroadcastChannel APIとlocalStorageイベントを組み合わせることで、幅広いブラウザでタブ間通信を安全かつ効率的に実装できます。

応用ポイント

  • 同じオリジン内のタブ間でリアルタイム通信が可能
  • 基本はpostMessageで送信、onmessageで受信
  • タブ閉鎖時はclose()を使ってリソース解放
  • 古いブラウザではlocalStorageイベントで代替可能
  • チャット機能やフォーム入力の同期など、実用的なタブ間通信にすぐ応用できる
  • パフォーマンスに配慮して必要なタイミングでチャンネルを閉じることが重要
先生と生徒の振り返り会話

生徒

「先生、BroadcastChannel APIを使うと、複数のタブでログイン状態やチャットメッセージを簡単に共有できるんですね?」

先生

「そうです。基本はpostMessageで送信して、onmessageで受信するだけで、初心者でもすぐに実装できます。タブ閉鎖時にclose()を呼ぶことも忘れずに。」

生徒

「古いブラウザではどうすればいいですか?」

先生

「その場合はlocalStoragestorageイベントを代替手段として使えます。これで、古いブラウザでもタブ間通信が可能です。」

生徒

「なるほど、これならチャットやフォーム同期など、いろいろな場面で使えそうですね。」

先生

「その通りです。タブ間通信を上手に使えば、ユーザー体験を向上させるウェブアプリが作れます。まずは基本を押さえて、少しずつ応用してみましょう。」

関連記事:
カテゴリの一覧へ
新着記事
New1
JavaScript
JavaScriptでURLを正規化(canonical)する方法を徹底解説!初心者向けにわかりやすく解説
New2
TypeScript
TypeScriptの型まとめ!安全で保守性の高いコードを書く方法
New3
TypeScript
TypeScriptのプロジェクトをtscでビルドする基本操作を解説!初心者にもわかるステップバイステップ
New4
Claude Code
Claude Codeの基本的な使い方!起動から終了まで初心者向けに解説
人気記事
No.1
Java&Spring記事人気No1
TypeScript
TypeScript学習におすすめの無料教材・リファレンスサイト【初心者向け】
No.2
Java&Spring記事人気No2
JavaScript
JavaScriptのインストール方法まとめ!Windows・Mac・Linux別にステップ解説
No.3
Java&Spring記事人気No3
JavaScript
JavaScriptの文字列を分割する方法(splitメソッド)
No.4
Java&Spring記事人気No4
JavaScript
JavaScriptで要素の表示・非表示を切り替える方法(display・visibility)を完全解説
No.5
Java&Spring記事人気No5
JavaScript
JavaScriptでフォームの値を取得する方法を徹底解説!valueプロパティの使い道
No.6
Java&Spring記事人気No6
JavaScript
JavaScriptのライブラリとは?標準ライブラリと外部ライブラリの違いと使い方
No.7
Java&Spring記事人気No7
TypeScript
TypeScriptでクライアントとサーバーのバリデーションを共通化する方法!初心者向けデータ検証入門
No.8
Java&Spring記事人気No8
JavaScript
JavaScriptでHello Worldを表示するには?最初の1行を実行してみよう