扩展工作算法
例如,我在网站C上,我看到pageAction,点击它,脚本解析所需信息,然后打开网站A,脚本在textarea中添加所有信息。
backround.js ---> c.js (signal to start parsing)
c.js ----> backround.js (message with information)
backround.js ----> a.js (that message, add in textarea) [Here I have problem]
的manifest.json
{
"name": "test",
"version": "0.0.1",
"manifest_version": 2,
"description": "test",
"icons": { "16": "16.png",
"48": "48.png",
"128": "128.png"
},
"page_action" :
{
"default_icon" : "icon19.png",
"default_title" : "TEST"
},
"background": {
"page": "html/background.html"
},
"content_scripts": [
{
"matches": ["http://A_SITE"],
"js": ["js/jquery.js", "js/a.js"]
},
{
"matches": ["http://C_SITE"],
"js": ["js/jquery.js", "js/c.js"]
},
],
"minimum_chrome_version":"31.0",
"offline_enabled": true,
"permissions": ["tabs", "http://C_SITE/*", "http://A_SITE/*"]
}
c.js
$(document).ready(function(){
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if (request.c_go == "go"){
//parsing here
chrome.runtime.sendMessage({ some obj }); // HERE I SEND MESSAGE TO BACKGROUND
}
});
});
a.js
$(document).ready(function(){
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if (request){
console.log(request); // NOTHING IN CONSOLE
}
});
});
background.js
function checkForValidUrl(tabId, changeInfo, tab) {
if(changeInfo.status === "loading") {
if (tab.url.indexOf('C_SITE') > -1) {
chrome.pageAction.show(tabId);
}
}
};
chrome.tabs.onUpdated.addListener(checkForValidUrl);
chrome.pageAction.onClicked.addListener(function(tab){
if (tab.url.indexOf('C_SITE') > -1){
// HERE I SEND MESSAGE TO c.js TO PARSING
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
chrome.tabs.sendMessage(tab.id, {c_go: "go"});
});
// OPENS SITE_A
chrome.tabs.create({url: "SITE_A", "active":true}, function(tab){
// REQUEST FROM c.js
chrome.runtime.onMessage.addListener( function(request, sender, sendResponse) {
// SEND REQUEST TO TAB WITH SITE_A
chrome.tabs.query({active: true, currentWindow: true}, function(tab) {
chrome.tabs.sendMessage(tab[0].id, request);
});
});
});
}
});
因此,在SITE_A的控制台中,我在控制台中看不到任何内容。这很奇怪,因为我在 c.js chrome.runtime.onMessage.addListener
中使用相同的代码。
如何解决?感谢。
答案 0 :(得分:1)
chrome.runtime.onMessage
是一个事件监听器,因此需要在所述事件发生之前定义它以便监听它。现在,您可以发送消息background -> c.js
,然后发送新消息c.js -> background.js
。这会将其变为race condition
,因为您的后台页面会打开新选项卡,并在c.js
尝试发送邮件的同时创建事件处理程序。相反,试着让它全部流动。
<强> c.js 强>
chrome.runtime.onMessage.addListener(function(request,sender,sendResponse){
if(request.c_go == "go"){
//parsing here
sendResponse({ some obj }); // HERE I SEND MESSAGE TO BACKGROUND
}
});
这会将消息c -> background
更改为对第一条消息的响应。
<强> background.js 强>
chrome.pageAction.onClicked.addListener(function(tab){
chrome.tabs.sendMessage(tab.id,{c_go:"go"},function(response){
chrome.tabs.create({url: "SITE_A", "active":true}, function(newTab){
chrome.tabs.executeScript(newTab.id, {file:"a.js"},function(){
chrome.tabs.sendMessage(newTab.id, response);
});
});
});
});
这样做是为了在Site A
获取信息之前不会打开Site C
。
答案 1 :(得分:0)
这是页面操作点击时发生的事情:
onMessage
侦听器以接收来自C_SITE的消息。不幸的是,介于1和3之间(在监听器注册之前),C_SITE发送其消息(不被注意)。
您应该始终确保在正确设置相应的侦听器之后触发事件。
<子>
请参阅上面的评论:
*您不必要地使用chrome.tabs.query()
并冒险破坏您的扩展程序的行为(例如,如果另一个widnow恰好变得意外活跃)。
*您不必要地使用$(document).ready()
。
子>