使用存储数据定义子菜单项

时间:2016-04-06 13:02:14

标签: google-chrome-extension local-storage contextmenu opera-extension

我的扩展程序应该使用用户的选项在主扩展上下文菜单条目下构建子菜单。选项存储在表中,每行定义一个子菜单。整个表存储为chrome.local.storage中的json字符串,密钥为jsondata

清单是:

   "background": {
  "persistent": true,
  "scripts": [ "js/storage.js", "js/backgroundlib.js", "js/background.js" ]
},
...
"permissions": [ "storage", "contextMenus", "http://*/*", "https://*/*",   "tabs", "clipboardRead", "clipboardWrite" ],
...

在后台脚本中,我正在尝试使用以下方式获取数据:

window.addEventListener('load', function () {
var key = 'jsondata';

 storage.area.get(key, function (items){ 
     console.log(items[key]);
     build_submenu(items[key]);}); 
 }); 

function build_submenu(json) {
     console.log("build_submenu: " + json);
 }
然后

build_submenu应调用多个chrome.contextMenus.create({... })来添加子菜单。 现在,我无法调用build_submenu。我是在尝试做一些不可能做到的事情,还是我只是错过了一些明显的东西?

谢谢,F。

3 个答案:

答案 0 :(得分:0)

storage.area.get替换为chrome.storage.local.get

另一个建议是删除外部window.onload侦听器,因为您使用的是后台脚本而window.onload没有任何意义。

答案 1 :(得分:0)

取得了一些进展:在background.js中,我使用

访问存储中的json字符串
var key = 'jsondata';
var data;
storage.area.get(key, function (items){ get_jsondata(items[key]);}); 

并且回调函数构建菜单条目及其子菜单。

function get_jsondata(value){
  console.log("get_jsondata " + value);
  data = JSON.parse(value);
var fcb =[ {fcb_context: "fcb_copy", title:"Copy filtered", context: ["selection", "link"]}, {fcb_context:"fcb_paste", context:["editable"], title:"Paste filtered"}];
 for (var i=0; i<fcb.length; i++) {
     var menu = fcb[i];
    chrome.contextMenus.create({
    title: menu.title,
    id: menu.fcb_context,
    contexts: menu.context,
    });
    var last = data.length;
    for (var j=0; j<last; j++){
        chrome.contextMenus.create({ 
          title: data[j].name, 
          contexts: menu.context, 
          parentId: menu.fcb_context,
          onclick:  function(info, tab){ run_cmd( data[j].regex, info, menu.fcb_context ); }
        });
    }// for j
  } // for i
}//get_jsondata

function run_cmd(regex, info, fcb_context){
    var sel = info.selectionText;
    console.log("run_cmd regex " + regex + " sel " + (sel ? sel : ""));
}

现在我遇到的问题是,当单击其中一个子菜单时,数据虽然定义为顶级变量,但似乎未定义。

我收到错误消息“无法读取未定义的属性正则表达式”

答案 2 :(得分:0)

好的,我终于得到了这个,有效: 的manifest.json

   "background": {
  "persistent": false,
  "scripts": [ "js/storage.js", "js/backgroundlib.js", "js/background.js" ]
  },
在background.js中的

,从存储中读取时,上下文菜单是在回调函数中构建的。触发onInstalled时会调用此读数。 我使用保存在Suspend上的全局变量,然后再次读取onStartup。并将子菜单ID与用户选项中的相应行相关联。 onClick侦听器测试是否定义了全局变量。如果不是,则从存储中再次读取。

    var regex = new Object();

chrome.runtime.onInstalled.addListener( function () {    
     console.log("onInstalled called");
     var key = 'jsondata';
     storage.area.get(key, function (items){ get_jsondata(items[key]);}); 
      function get_jsondata(value){
      var data = JSON.parse(value);

      var fcb =[ {fcb_context: "fcb_copy", title:"Copy filtered", context: ["selection", "link"]}, {fcb_context:"fcb_paste", context:["editable"], title:"Paste filtered"}];
     for (var i=0; i<fcb.length; i++) {
         var menu = fcb[i];
        chrome.contextMenus.create({
    //title: "Look up: %s",
        title: menu.title,
        id: menu.fcb_context,
        contexts: menu.context,

        });
        var last = data.length;
    //var sel = info.selectionText;
        for (var j=0; j<last; j++){
            chrome.contextMenus.create({ 
            title: data[j].name, 
            contexts: menu.context, 
            id: menu.fcb_context + "_" + j,
            parentId: menu.fcb_context,
                    //onclick:  function(info, tab){ run_cmd( data[j].regex, info, menu.fcb_context ); }
            });
            regex[ menu.fcb_context + "_" + j] = data[j];
            //console.log(regex[menu.fcb_context + "_" + j]);
        }// for j

    } // for i
    }//get_jsondata

}); //add listener


chrome.contextMenus.onClicked.addListener(function(info, tabs){ 
                var id = info.menuItemId;
                if (typeof regex === "undefined" ){
                    storage.area.get("regex", function(items){
                        regex = JSON.parse(items["regex"]);
                        console.log("get " + items["regex"] + " from storage");
                            run_cmd( regex, info );  
                    });
                 } else { 
                     console.log("regex was defined... " + JSON.stringify(regex));
                         run_cmd( regex, info );  
                 }
   });

chrome.runtime.onSuspend.addListener(function() {
  // Do some simple clean-up tasks.
  console.log("onSuspend called saving " + JSON.stringify(regex));
  storage.area.set({ "regex" : JSON.stringify(regex)}, function(){console.log("regex saved");} );
});

chrome.runtime.onStartup.addListener(function() {
     console.log("onStartup called");
     storage.area.get("regex", function(items){
        regex = JSON.parse(items["regex"]);
        console.log("get " + items["regex"] + " from storage");
     });
});



function getSelectedText(info){
    var sel = info.selectionText;
    chrome.tabs.executeScript(null, {file:"js/script.js"});
}

function pasteFilteredText(info){
    chrome.tabs.executeScript(null, {file:"js/script.js"});
}




function run_cmd(regex, info){
    var id = info.menuItemId;
     var data =  regex[id];

        var sel = info.selectionText;
    var fcb_context = info.parentMenuItemId;
    //console.log("run_cmd regex " + data.regex + " sel " + (sel ? sel : ""));
    alert("run_cmd regex " + data.regex + " sel " + (sel ? sel : "") + " fcb_context: " + fcb_context);

}

感谢您指出我多余或缺失的东西。