2

chome 拡張機能にチェックボックスとしてコンテキスト メニューを作成しました。編集可能なフィールドでのみ表示されるメニューを作成することに成功しました。

問題は、テキストフィールド(フォーカスされた要素)のデータ属性に従って、メニューをチェック済みとして表示する必要があることです。次のコードでは、グローバル レベルでチェックされた状態で表示されます (あるページ/要素でメニューをチェックした場合、他のページ/要素もチェックされたままになります)。

要素の data 属性に従ってチェック/チェック解除するにはどうすればよいですか?

var addinMenu = chrome.contextMenus.create({
    "title": "My Addin Menu",
    "contexts": ["editable"]
});
var disableOrEnable = chrome.contextMenus.create({
    "type": "checkbox",
    "title": "Disable",
    "parentId": addinMenu,
    "id": "myaddin_disable",
    "checked": true,
    "contexts": ["editable"],
    "onclick": disableOrEnableMyAddin
});
4

1 に答える 1

3

chrome.contextMenus.update()メニュー プロパティを変更する必要がある場合に呼び出します。たとえば、次のようになります。

chrome.contextMenus.update(
  disableOrEnable,
  { type: 'checkbox', checked: false });

イベントをキャッチoncontextmenuして、投稿されたメニューにすぐに反映される変更を加えることができるように見えます (ただし、Rob W のコメントから、競合状態が発生する可能性があることがわかります)。これは私のために働く:

var contextMenu = chrome.contextMenus.create(
  {
    type: 'checkbox',
    title: 'how now brown cow',
    checked: false,
    contexts: ['all']
  });

var element = document.getElementById('hello');
element.addEventListener(
  'mouseover',
  function(e) {
    element.setAttribute('underMouse', 'true');
  });
element.addEventListener(
  'mouseout',
  function(e) {
    element.setAttribute('underMouse', '');
  });

window.oncontextmenu = function(e) {
  chrome.contextMenus.update(
    contextMenu,
    {
      type: 'checkbox',
      checked: element.getAttribute('underMouse') == 'true'
    });
}

現在フォーカスされているテキストフィールドだけに興味がある場合は、メニューfocusblurイベントを変更することもできます。'editable'また、メニュー プロパティのオプションを確認することもできcontextsます (それが何をするのかはわかりませんが、メニューをテキスト入力要素に制限するように思えます)。

于 2013-03-09T05:07:02.697 に答える