Расширение Chrome Отправить сообщение от Background.js к контенту Script
Я прочитал документацию о том, как сделать Отправить сообщение Из фонового файла javascript (main.js) в Content Script (content.js), но я не могу заставить onMessage открыть мое оповещение.
manifest.json
{
"name": "Example",
"version": "1.0.1",
"manifest_version" : 2,
"description": "Example Description",
"background" : {
"scripts" : ["main.js"]
},
"page_action" : {
"default_icon": {
"19": "icons/19.png",
"38": "icons/38.png"
},
"default_title" : "Example Title"
},
"content_scripts": [{
"matches": ["<all_urls>"],
"js": ["lib/jquery-1.8.3.min.js","scripts/content.js"],
"run_at": "document_idle",
"all_frames": false
}],
"permissions": [
"tabs",
"geolocation"
],
"icons": {
"16": "icons/16.png",
"48": "icons/48.png",
"128": "icons/48.png"
}
}
Фон javascript файл (main.js)
chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
chrome.tabs.sendMessage(tabs[0].id, {action: "SendIt"}, function(response) {});
});
Содержимое javascript файла (content.js)
chrome.extension.onMessage.addListener(function(msg, sender, sendResponse) {
if (msg.action == 'SendIt') {
alert("Message recieved!");
}
});
Ответы
Ответ 1
Благодаря пониманию @Teepeemm, я включил завершение загрузки вкладки перед отправкой сообщения в контент script.
ПОДТВЕРЖДАЙТЕСЬ, ЧТОБЫ БЫТЬ ПОЛНОСТЬЮ ЗАГРУЖЕНЫ
chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) {
if (changeInfo.status == 'complete') {
chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
chrome.tabs.sendMessage(tabs[0].id, {action: "SendIt"}, function(response) {});
});
}
});
Ответ 2
Sidenote: chrome.extension.onMessage
устарел, вы должны использовать chrome.runtime.onMessage
- хотя я не верю, что это решит вашу проблему.
Я помню, что у меня была проблема с введением мини файла jquery с использованием скриптов содержимого. Попробуйте использовать неинфицированную версию (например, jquery-1.8.3.js). Как только вы это сделаете, добавьте jquery-1.8.3.js
в web_accessible_resources
в файл манифеста. (Читайте об этом здесь)
Если это все еще не работает, моим последним предложением было бы добавить "<all_urls>"
в массив разрешений в вашем манифесте.
Ответ 3
Если у вас есть script объявить о своем присутствии (я предпочитаю от console.log
до alert
), вы увидите, что фоновый script выполняется один раз (при установке или запуске), а контент script работает с каждый новая страница. Это означает, что вы хотите, чтобы какое-то внешнее событие вызывало это сообщение. Что-то вроде
chrome.pageAction.onClicked.addListener(function(tab) {
chrome.tabs.sendMessage(tab.id,{action:"SendIt"});
});
И не забудьте вызвать chrome.pageAction.show(tabId);
, если это необходимо.