消息传递接收端

时间:2013-12-10 20:41:58

标签: javascript google-chrome-extension

扩展工作算法

例如,我在网站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中使用相同的代码。

如何解决?感谢。

2 个答案:

答案 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)

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

  1. 您向C_SITE发送消息。
  2. 使用A_SITE创建新标签页。
  3. 注册onMessage侦听器以接收来自C_SITE的消息。
  4. 您可以将任何消息从C_SITE转发到A_SITE。
  5. 不幸的是,介于1和3之间(在监听器注册之前),C_SITE发送其消息(不被注意)。
    您应该始终确保在正确设置相应的侦听器之后触发事件。


    <子> 请参阅上面的评论:
    *您不必要地使用chrome.tabs.query()并冒险破坏您的扩展程序的行为(例如,如果另一个widnow恰好变得意外活跃)。
    *您不必要地使用$(document).ready()