消息传递接收端
Message Passing receiving end
扩展的工作算法
例如,我在站点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()
。
相关文章:
- 在node.js应用程序中接收JMS消息
- 为什么我得到Chrome本机消息“;找不到指定的本机消息传递主机&”;
- 将web浏览器客户端输入传递给服务器Java源代码
- 消息传递系统 jquery 发送jQuery514109241_1210239812938当我在消息中放入:))时
- 从服务器端经典 asp 和客户端 javascript 传递字符串
- 有没有一种简单的转换方法可以将chrome消息传递转换为safari消息传递语法
- 消息传递接收端
- 基本的谷歌chrome扩展消息传递不起作用
- Nodejs-websocket:如何在没有服务器响应的情况下连续发送客户端消息
- Chrome 扩展消息传递体系结构
- 为什么我无法将此消息传递到选项卡中运行的所有帧
- Chrome扩展消息传递:未发送响应
- 将一个 html 页面中接收的数据传递到另一个页面
- 为什么在定义回调/侦听器函数(异步消息传递,port.on)后没有立即设置全局变量
- chrome.tabs.sendRequest:“端口错误:无法建立连接.接收端不存在
- Nodejs,客户端并不总是接收服务器消息
- 在 MQTT 客户端中“未捕获的引用错误:未定义消息传递”
- 通过应用程序级事件传递的 TIBlob 在接收端变为 NULL
- Ember RSVP承诺解决firefox插件端口消息传递方案无法解决的模型
- 不同应用程序在不同端口上的跨域消息传递