消息传递接收端

Message Passing receiving end

本文关键字:接收端 消息传递      更新时间:2024-06-03

扩展的工作算法

例如,我在站点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获得信息之前不会打开。

这就是页面操作点击时发生的情况:

  1. 您将消息发送到C_SITE
  2. 使用A_SITE创建新选项卡
  3. 您注册一个onMessage侦听器以接收来自C_SITE的消息
  4. 您可以将任何消息从C_SITE转发到A_SITE

不幸的是,在1到3之间的某个位置(在侦听器注册之前),C_SITE会发送其消息(未被注意到)
您应该始终确保您的事件在正确设置相应的侦听器之后被触发。


请参阅我上面的评论:
*您不必要地使用chrome.tabs.query(),并有破坏扩展行为的风险(例如,如果另一个widnow意外地变为活动)
*您不必要地使用$(document).ready()