2016-07-09 3 views
1

творит расширение, в котором клиент генерирует некоторые данные в расширении и сохраняет его в массиве объектов в localStorage динамически, как:Как добавить динамическое расширение в контекстное меню в расширении Chrome?

var list = [{},{newly added object}]; 
localStorage.setItem("data", JSON.stringify(links)); 

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

chrome.contextMenus.create({ 
    id: "****", 
    title: "***", 
    contexts: ["all"] 
}); 

chrome.contextMenus.onClicked.addListener(function(info, tab) { 
    if (info.menuItemId == "some-id") { 
     // do something 
} 

}); 

Как я могу это сделать? Любое полезное предложение будет оценено по достоинству.

+1

Не очень понятно, о вашем вопросе. Скажем, у вас есть массив объектов, и вы хотите создавать элементы contextmenu для каждого объекта, так же есть ли проблемы с использованием цикла forEach? –

+0

@Hibara Я разместил этот ** chrome.contextMenus.create ** код в фоновом скрипте, но он работает только при загрузке, когда пользователь создает новый объект, тогда фоновый скрипт запускается только после загрузки и я хочу, чтобы он запускался сразу после добавления , – shuboy2014

+0

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

ответ

2
  1. Каждый раз, когда вы звоните localStorage.setItem, вы могли бы использовать что-то вроде Message Passing сказать фона страницы пришло время обновить контекстное меню. Затем вы можете использовать chrome.contextMenus.create или chrome.contextMenus.update для обновления контекстного меню.

    chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { 
        chrome.contextMenus.create({ 
         id: "****", 
         title: "***", 
         contexts: ["all"] 
        }); 
    }); 
    
  2. Вы также можете сохранить пользовательские данные через chrome.storage.local.set, которая разделена между сценариями содержания и фона страницы, то вы можете зарегистрировать обработчик событий для chrome.storage.onChanged в Backgorund страницы и обновить контекстное меню внутри обработчика.

    chrome.storage.onChanged.addListener(function(changes, areaName) { 
        chrome.contextMenus.create({ 
         id: "****", 
         title: "***", 
         contexts: ["all"] 
        }); 
    }); 
    
+0

ваш вариант 1 не создает ** контекстное меню ** сразу после добавления нового объекта. – shuboy2014

+0

, когда я перезапускаю хром, тогда он отображается. – shuboy2014

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