質問するログイン新規登録
JavaScript

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

Chrome extension

Chrome拡張機能

Q&A

解決済

1回答

2295閲覧

現在のタブのURLを取得したい

matonrin

総合スコア12

JavaScript

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

Chrome extension

Chrome拡張機能

0グッド

0クリップ

投稿2020/08/16 06:21

0

0

chrome拡張機能において、content scriptから現在のタブのURLを取得したいのですが、できませんでした。

以下に自分がやろうとした方法を載せるので、どこが間違っているのか教えて下さい。または、別のもっと簡単な方法があれば教えて下さい。

JavaScript

1// content_script.js 2function useURLFunc(){ 3 // sendMessageは非同期関数なので、awaitで実行終了を待つ。 4 let sendMsgFunc = () => { 5 return new Promise(resolve => { 6 chrome.runtime.sendMessage({greeting: 'url'}, response => { 7 resolve(response.farewell); 8 }); 9 }); 10 }; 11 // SyntaxError: await is only valid in async function 12 let url = await sendMsgFunc(); 13 14 // 以下、urlを使った処理 15} 16 17useURLFunc();

JavaScript

1// event.js 2chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { 3 if (request.greeting=='url') { 4 let queryinfo = {'active': true, 'currentWindow': true}; 5 chrome.tabs.query(queryinfo, function(tabs) { 6 sendResponse({farewell: tabs[0].url}); 7 }); 8 return true; 9 } 10});

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

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

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

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

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

matonrin

2020/08/16 07:46

現状、event.jsにおけるURLの取得は出来ていて、sendMessage側でもURLを受け取ることは出来ています。問題は、受け取ったURLが変数に入る前にURLを利用する処理に進んでしまうことだと考えています。 このコードについてですが、currentURLはcontent scriptから参照できないので、URLを取得できたか否かに関わらず、状況に変化はないと思います。 現状説明が不足していてすみません。
guest

回答1

0

ベストアンサー

とりあえずフルで書きました。面倒なのでちゃんとマニフェストまで付けてください。
原因は拡張機能ページでエラー表示されてたと思いますが、await使ってるのにasyncが付いてないからです。
この実装はteratailのトップページだけで機能するマニフェストになってます。

content.js

JavaScript

1// content_script.js 2async function useURLFunc() { 3 let sendMsgFunc = () => { 4 return new Promise(resolve => { 5 chrome.runtime.sendMessage({ greeting: 'url' }, response => { 6 resolve(response.farewell); 7 }); 8 }); 9 }; 10 let url = await sendMsgFunc(); 11 console.log(url + " from ほげ extention!"); 12} 13 14(async () => { 15 await useURLFunc(); 16})();

event.js

javascript

1// event.js 2chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { 3 if (request.greeting=='url') { 4 let queryinfo = {'active': true, 'currentWindow': true}; 5 chrome.tabs.query(queryinfo, function(tabs) { 6 sendResponse({farewell: tabs[0].url}); 7 }); 8 return true; 9 } 10});

manifest.json

json

1{ 2 "manifest_version": 2, 3 "name": "ほげ", 4 "version": "1.0", 5 "content_scripts": [ 6 { 7 "matches": [ 8 "https://teratail.com/" 9 ], 10 "js": [ 11 "content.js" 12 ] 13 } 14 ], 15 "background": { 16 "scripts": [ 17 "event.js" 18 ], 19 "persistent": false 20 }, 21 "permissions": [ 22 "tabs" 23 ] 24}

投稿2020/08/18 01:12

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

matonrin

2020/08/18 02:36

回答ありがとうございます。 asyncは明示的に指定しなければならないんですね。 manifestファイルの内容を記載していなかったせいでお手間を取らせてしまい、すみませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問