0

Мое расширение должно использовать параметры пользователя для создания подменю в главном меню контекстного меню расширения. Параметры сохраняются в таблице, где каждая строка определяет подменю. Вся таблица хранится как строка json в chrome.local.storage с ключом 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. Я пытаюсь сделать что-то, что невозможно, или я просто пропущу что-то очевидное?

Спасибо, Ф.

ответ

0

storage.area.get Заменить с chrome.storage.local.get.

Другое предложение - удалить внешний прослушиватель window.onload, так как вы используете фоновые скрипты и window.onload не имеет смысла.

+0

'storage.area' определяется в js/storage.js на' chrome.storage.local', поэтому я бы сказал, что здесь нет проблемы – fraz

+0

@fraz, что у вас есть? Был ли 'console.log (items [key])' выводить что-нибудь? –

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 : "")); 
} 

Теперь я получил эту проблему, что данные, хотя и определяется как переменная верхнего уровня, кажется неопределенным, когда один из подменю кнопки.

Я получил сообщение об ошибке «не может прочитать свойство регулярное выражение не определено»

+0

Я думаю, что вы вне сферы видимости ... попробуйте вытащить данные [j] внутри * chrome.contextMenus.create * как некоторую переменную, а затем использовать эту переменную в качестве передающего аргумента в функции ** run_cmd ** ... для данных [J] .regex –

0

ОК, я, наконец, получил это, что работает: manifest.json

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

в background.js, контекстное меню встроена функция обратного вызова при чтении из хранилища. Это чтение вызывается, когда onInstalled уволен. Я использую глобальный var, который сохраняется в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); 

} 

Спасибо, что указали мне, что лишнее или отсутствует.

Смежные вопросы