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

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

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

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

Chrome extension

Chrome拡張機能

Q&A

解決済

1回答

2753閲覧

Chrome拡張機能のchrome.contextMenus.onClicked.addListenerが動かない

tettyA

総合スコア93

JavaScript

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

Chrome extension

Chrome拡張機能

0グッド

1クリップ

投稿2022/04/30 14:06

私は今、Chromeの拡張機能を作っており、どうしても分からないところがあったので質問させていただきました。
まず、コードをみてください。

js

1//back.js 2chrome.runtime.onInstalled.addListener(function(){ 3 const menu=chrome.contextMenus.create({ 4 type:"normal", 5 id:"contextno", 6 title:"ダウンロード", 7 contexts:["image"], 8 documentUrlPatterns:["https://www.pixiv.net/artworks/*"] 9 }); 10}); 11 12chrome.contextMenus.onClicked.addListener(function(info){ 13 let ta=document.createElement("a"); 14 ta.href=info.srcUrl; 15 ta.setAttribute('download',"a"); 16 ta.dispatchEvent(new CustomEvent('click')); 17});

json

1//manifest 2{ 3 "manifest_version": 3, 4 "name":"pixivdownload", 5 "version":"1.0.0", 6 "description":"pixivdownload", 7 "icons":{ 8 "16": "icon16.png" 9 }, 10 "background":{ 11 "service_worker":"back.js", 12 "president":false 13 }, 14 "permissions":[ 15 "tabs", 16 "scripting", 17 "activeTab", 18 "contextMenus" 19 ], 20 "host_permissions":[ 21 "https://www.pixiv.net/*" 22 ] 23}

この拡張機能の目標は、pixivの画像を右クリックからメニューそ選択しでダウンロードできるようにすることです。(名前を付けて画像を保存、は知っています。学習のために作っています。)
画像の上で右クリックしたときにメニューで"ダウンロード"と表示されるところ(下の画像)まではできたのですが、
イメージ説明
それをクリックしてもchrome.contextMenus.onClickedがなかなか思うように動いてはくれません。
(この記事を参考にして、画像を保存しようとしています。)

どうすれば私の意図(右クリックされた画像を保存するためのダイアログを出し、フォルダや名前を指定し、ダウンロードする)通りに実行されますか?

初心者で分かりにくい点も多いと思いますが、御教授よろしくお願いします。

試してみたこと

chrome.contextMenus.onClicked.addListenerが実行されているかの確認
chrome.contextMenus.onClicked.addListener

js

1chrome.contextMenus.onClicked.addListener(function(info){ 2 window.open("https://teratail.com/","_blank"); 3});

に変更して実行しましたが、teatailは開きませんでした。
そもそもchrome.contextMenus.onClicked.addListenerが発火していないのではないのか?と思っています。

追加の質問

エラーを見ようとしても、真っ白なだけで何も表示されません(chrome://extensions/ではエラーと表示されたいます)。
イメージ説明
原因がもし分かればどなたか御教授おねがいします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Manifest V3では、バックグラウンドスクリプトでDOMを操作することはできないようです。
スクリプトを特定のタブ内に挿入することでDOMを操作することが可能になります。
そのためにはまずManifest.json"permissions""scripting"を加えます。
そしてonClickedでは次のようにします。

JavaScript

1chrome.contextMenus.onClicked.addListener((info, tab) => { 2 switch (info.menuItemId) { 3 case "contextno": 4 chrome.scripting.executeScript({ 5 target: { tabId: tab.id }, 6 function: download, 7 args: [info.srcUrl] 8 }); 9 break; 10 } 11}); 12 13function download(url) { 14 alert(url); 15}

タブに挿入されたdownloadの中では、そのタブのDOMにアクセスできます。

投稿2022/04/30 15:42

itagagaki

総合スコア8402

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

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

tettyA

2022/05/01 05:23

ありがとうございました! 無事出来ました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問