質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Chrome extension

Chrome拡張機能

Q&A

解決済

1回答

1896閲覧

【chrome extension】backgroundとcontentのメッセージのやり取りが分からない

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Chrome extension

Chrome拡張機能

0グッド

1クリップ

投稿2022/07/21 03:00

質問内容

JSでGoogle拡張機能v3ポモドーロタイマーを作成しています。
chrome.tabs.sendMessagechrome.runtime.onMessage周辺が分からず、アラームを鳴らせない。

【現状】
popup画面にて、タイマーが正常に稼働し、
時間になればアラームが鳴るようになっています。

ただ全てpopup.html / popup.jsにて行なっているので
当然画面を閉じると処理は止まっている状態です。

実現したいこと

popupの画面を閉じていても、アラームが鳴るようにしたい。

しかしv3では、backgroundにて音声が再生できないとの記事を見つけました。

【試そうとしたこと】
bgにて音声ファイルを取得し、content.jsにて再生。

該当のソースコード

background.js

1let audio = chrome.runtime.getURL('src/mp3/audio.mp3'); 2 3//結果を格納する配列を宣言 4let array = []; 5 6//ブラウザのタブを取得 7chrome.tabs.query({lastFocusedWindow: true},function(tabs){ 8 //取得したタブ数分を繰り返し 9 for(let i=0; i<tabs.length; i++){ 10 let output = tabs[i].url; //urlを取得 11 array.push(output); 12 } 13 console.log(array) //各開いてるタブのリンクを取得成功 14 chrome.tabs.sendMessage(array,({audio: `${audio}`}, function(response){ 15 response; 16 })) 17});

content.js

1chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) { 2 request.audio.play(); 3 return true; 4 } 5);

発生している問題・エラーメッセージ

公式にて利用法を参照しましたが、それでも使い方が理解できていないのでご助力をお願いします。

Error handling response: TypeError: Error in invocation of tabs.sendMessage(integer tabId, any message, optional object options, optional function callback): No matching signature.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

エラーメッセージの通り sendMessage() の第一引数はタブIDです。質問文のコードでは URL の配列を渡しているので動くわけがありません。

js

1for (let tab of tabs) { 2 chrome.tabs.sendMessage(tab.id, ...

という感じになるはずです。

投稿2022/07/21 03:32

編集2022/07/21 03:50
int32_t

総合スコア20672

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/07/21 09:25

ご回答ありがとうございます! ご指摘いただいた通り``id``にしましたが、同様のエラーが出ました。 見たところ``tabId``、``message``、``function``は揃っているように感じます。なぜでしょうか? ```background.js let audio = chrome.runtime.getURL('src/mp3/audio.mp3'); chrome.tabs.query({active: true, currentWindow: true },function(tab){ chrome.tabs.sendMessage(tab.id, {audio: `${audio}`}, function(response){ if (response) { alert(response); } }) }) ``` ```content.js chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) { request.audio return true; } ); ```
int32_t

2022/07/21 09:31

回答にわざわざ「for (let tab of tabs) {」と書いてあるんですから、それを無視しては駄目です。 for なしで書くなら、tab.id を tab[0].id にすればいいでしょう。query の結果が配列なので。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問