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

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

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

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

Chrome extension

Chrome拡張機能

Q&A

解決済

1回答

1329閲覧

Chrome Extensionで作ったContext Menuの状態を取得したい

irognodyci

総合スコア227

JavaScript

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

Chrome extension

Chrome拡張機能

0グッド

1クリップ

投稿2021/11/10 00:29

編集2021/11/10 01:44

前提・実現したいこと

javascriptもchrome extensionも初心者で、調べながら拡張機能を作っています。

chrome.runtime.onInstalled.addListenerでcheckboxタイプのメニューを一つ追加しました。
このメニューにチェックが入っているか入っていないかで処理を分けたいです。

発生している問題

そもそもどのようにしてcontext menuの要素にアクセスするかがわかりません。

該当のソースコード

background.js

javascript

1chrome.runtime.onInstalled.addListener(function () { 2 const check1 = chrome.contextMenus.create({ 3 title: "checkbox", 4 type: "checkbox", 5 id: "checkbox1", 6 contexts: ["all"], 7 checked:true 8 }); 9});

試したこと

アクセス方法がわからなかったため、関数外に変数を用意し作成したメニューがクリックされたらその変数にチェックボックスの状態を入れていました。

javascript

1var flag = true; 2 3chrome.contextMenus.onClicked.addListener(function (item) { 4 if (item.checked == true){ 5 flag = true 6 } else { 7 flag = false 8 } 9});

この場合、
①拡張機能読み込み(この時点ではchecked:trueによりtrue。flagも初期化でtrue。メニューにもチェックが入っている)
②メニューをクリック(イベント発生でitem.checkedがfalse、flagもfalse。メニューのチェックは外れる)
~ここまでは期待通りの動作~
③Chromeを再起動(メニューはチェックが外れたまま。flagは初期化されるためtrue。ここでずれが発生してしまう)
④flagの値で分岐させた処理を行う(flagの値を見ているのでチェックが外れているのにtrueとして処理が進んでしまう)
という感じで途中から動作が期待通りになりません。

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

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

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

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

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

int32_t

2021/11/10 00:36

> 再起動した後メニューをクリックせずに処理を行うとtrueのままになってしまって、期待通りになりませんでした chrome.contextMenus.create() で checked:true を指定しているので、デフォルトは true で正しいのではないのですか?
irognodyci

2021/11/10 01:30

説明不足で申し訳ないです。 流れとしましては、 ①拡張機能読み込み(この時点では仰る通りchecked:trueによりtrue。メニューにもチェックが入っている) ②メニューをクリック(イベント発生でitem.checkedがfalse、flagもfalse。メニューのチェックは外れる) ~ここまでは期待通りの動作~ ③Chromeを再起動(メニューはチェックが外れたまま。flagは初期化されるためtrue。ここでずれが発生してしまう) ④flagの値で分岐させた処理を行う(flagの値を見ているのでチェックが外れているのにtrueとして処理が進んでしまう) このような感じになっています。 メニューの作成をインストール時にしなければズレは発生しませんが、再起動の度にメニューをクリックして設定しなきゃいけないのは手間だと思いまして。
guest

回答1

0

ベストアンサー

良い質問ですね。

chrome.contextMenusにはアイテムの状態を取得する方法が見当たりません。
なので質問者がすでに行っているようにonClickedで状態が変化したときにそれを記憶するしかなさそうです。

私の提案は、それをグローバル変数ではなくローカルストレージに保存して、必要なときそれを参照することです。

chrome extensionでデータを保存する - おおたの物置

それで不整合は無くなると思います。いかがでしょうか。

投稿2021/11/10 12:28

itagagaki

総合スコア8402

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

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

irognodyci

2021/11/15 08:33 編集

確認遅くなって申し訳ありません。 自環境で確認したところうまく動きました。ありがとうございます。 やはりcontext menuの状態を確認する方法は見当たらないですよね。どこかにありそうな気がするのですが、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問