扩展的工作算法
例如,我在站点C上,我看到pageAction,点击它,脚本解析所需信息,然后打开站点A,脚本将所有信息添加到文本区域。
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.jschrome.runtime.onMessage.addListener
中使用了相同的代码。
如何修复?谢谢
chrome.runtime.onMessage
是一个事件侦听器,因此需要在所述事件发生之前定义它才能侦听它。现在,它发送一条消息background -> c.js
,然后发送一条新消息c.js -> background.js
。在c.js
尝试发送消息的同时,后台页面打开新选项卡并创建事件处理程序,从而将其转换为race condition
。相反,试着让一切都流畅起来。
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
}
});
这将消息CCD_ 7改变为对第一消息的响应。
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
获得信息之前不会打开。
这就是页面操作点击时发生的情况:
- 您将消息发送到C_SITE
- 使用A_SITE创建新选项卡
- 您注册一个
onMessage
侦听器以接收来自C_SITE的消息 - 您可以将任何消息从C_SITE转发到A_SITE
不幸的是,在1到3之间的某个位置(在侦听器注册之前),C_SITE会发送其消息(未被注意到)
您应该始终确保您的事件在正确设置相应的侦听器之后被触发。
请参阅我上面的评论:
*您不必要地使用chrome.tabs.query()
,并有破坏扩展行为的风险(例如,如果另一个widnow意外地变为活动)
*您不必要地使用$(document).ready()
。