2015-03-20 2 views
0

Расширение касается только нескольких сайтов. Таким образом, у него есть обычный значок, который отображается на панели инструментов (действие браузера), и когда пользователь открывает сайт, который поддерживается, значок должен измениться на другой, чтобы указать его. То же самое должно произойти, когда пользователь переключает вкладки. Я попытался настройки фона страницы и отправить сообщение на всплывающей странице, как показано ниже,Обновить значок расширения хрома на вкладке switch/change

background.js

chrome.tabs.onActivated.addListener(function(tabId, changeInfo, tab) {   
    chrome.runtime.sendMessage({msg: 'supported'}); 
}); 

всплывающее окно

chrome.extension.onMessage.addListener(function(message, messageSender, sendResponse) { 
    updateIcon(); 
}); 

Но это не работает. Функция updateIcon() прекрасна, поскольку она работает при вызове со всплывающей страницы. Я новичок в развитии расширения chrome, поэтому я не уверен, что я делаю неправильно здесь, буду признателен за любую помощь. Благодарю.

+3

Есть ли причина, по которой вы не используете действие страницы? Они предназначены для расширений, относящихся только к нескольким сайтам. – Teepeemm

ответ

1

Вы можете использовать message passing, чтобы сделать это с помощью скриптов контента, чтобы обнаружить переключатель на поддерживаемой странице, а затем уведомить страницу фона, чтобы отобразить значок действия браузера для этой страницы. Ваш сценарий контент должен отправить сообщение с помощью chrome.runtime.sendMessage и фон страницы должны слушать с помощью chrome.runtime.onMessage.addListener:

Я создал образец кода и тестирование он работает со мной:

Содержание сценария:

if(onSupportedPageNeedChangeIcon) { 
    // send message to background script 
    chrome.runtime.sendMessage({ "newIconPath" : "newicon.png" }); 
} 

фона страница:

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) { 
     // read `newIconPath` from request and read `tab.id` from sender 
     //alert("good"); 
     chrome.browserAction.setIcon({ 
      path: request.newIconPath, 
      tabId: sender.tab.id 
     }); 
    }); 

Также имейте в виду, чтобы зарегистрировать код вашего содержания сценария в манифесте как:

"content_scripts": [ 
    { 
     "matches": ["http://www.supportedwebsiteone.com/*", "http://www.supportedwebsitetwo.com/*"], 
     "js": ["myscript.js"] 
    } 
    ] 
+0

Мне тоже не нужен доступ к вкладкам api? Это кажется недоступным из сценария контента (продолжает давать неопределенную ошибку). Кроме того, мне также нужно знать доменное имя. Короче говоря, расширение относится только к нескольким доменам, но все же в зависимости от домена другой набор данных будет выведен из сервера и для указания того, что при открытии новой вкладки будет отображаться другой значок + значок поддерживаемый сайт или переключается на вкладку с поддерживаемым доменом (например, в adblock/disconnect отображается значок). – redGREENblue

+0

Вам не нужно обращаться к вкладкам api в моем простом примере, так как он отправляет запрос из сценария контента и просто использует 'runtime.sendMessage': [https://developer.chrome.com/extensions/messaging](https: //developer.chrome.com/extensions/messaging). Вы можете указать домены в свойствах «match» из «content_scripts»: [https://developer.chrome.com/extensions/content_scripts](https://developer.chrome .com/удлинители/content_scripts) – gui47

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