我一直在尝试将数据从后台页面发送到chrome扩展程序中的内容脚本。我似乎无法使其正常工作。我已经在线阅读了一些帖子,但是它们并不十分清晰,而且水平很高。我已经设法通过Chrome示例上的Oauth联系人示例使oauth正常工作。身份验证有效,我可以通过打开新选项卡获取数据并将其显示在html页面中。

我想将此数据发送到内容脚本。

我对此有很多麻烦,如果有人能概述将数据从bg页发送到内容脚本甚至更好的代码所需遵循的明确步骤,我将不胜感激。有没有人?

我的背景页面的代码如下(我已经排除了oauth参数和其他)

` function onContacts(text, xhr) {
    contacts = [];
    var data = JSON.parse(text);
    var realdata = data.contacts;
    for (var i = 0, person; person = realdata.person[i]; i++) {
      var contact = {
        'name' : person['name'],
        'emails' : person['email']
      };


      contacts.push(contact); //this array "contacts" is read by the
 contacts.html page when opened in a new tab

    }

    chrome.tabs.create({ 'url' : 'contacts.html'}); sending data to new tab
    //chrome.tabs.executeScript(null,{file: "contentscript.js"});
    may be this may work?

  };

  function getContacts() {
    oauth.authorize(function() {
      console.log("on authorize");
      setIcon();
      var url = "http://mydataurl/";
      oauth.sendSignedRequest(url, onContacts);

    });
  };

  chrome.browserAction.onClicked.addListener(getContacts);`


由于我不太确定如何将数据获取到内容脚本中,因此我不会麻烦发布失败的内容脚本的多个版本。如果我可以从我的内容脚本中获取有关如何请求“联系人”数组以及如何从bg页面发送数据的示例,那将是非常不错的!

最佳答案

您有两种选择可将数据导入内容脚本:


使用Tab API:
http://code.google.com/chrome/extensions/tabs.html#method-executeScript
使用消息传递:
http://code.google.com/chrome/extensions/messaging.html


使用Tab API

当我的扩展名偶尔会被使用时,例如setting the image as my desktop wallpaper,我通常会使用这种方法。人们不会每秒钟或每分钟设置墙纸。他们通常每周一次甚至每天一次。因此,我只是将内容脚本注入该页面。这样做很容易,您可以按照文档中的说明通过文件或代码来完成:

chrome.tabs.executeScript(tab.id, {file: 'inject_this.js'}, function() {
  console.log('Successfully injected script into the page');
});


使用消息传递

如果您不断需要网站中的信息,最好使用消息传递。消息传递有两种类型,即长期请求和单次请求。您的内容脚本(在manifest中定义)可以监听扩展请求:

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
  if (request.method == 'ping')
    sendResponse({ data: 'pong' });
  else
    sendResponse({});
});


并且您的背景页面可以通过消息传递向该内容脚本发送消息。如下所示,它将获得当前选择的选项卡,并将请求发送到该页面。

chrome.tabs.getSelected(null, function(tab) {
  chrome.tabs.sendRequest(tab.id, {method: 'ping'}, function(response) {
    console.log(response.data);
  });
});


取决于您的扩展名使用哪种方法。我都用过。对于每秒钟都会使用的扩展,我使用消息传递(万岁)。对于将不会每次使用的扩展,那么您不必在每个页面中都使用内容脚本,则只需使用Tab API executeScript,因为它会在需要时注入内容脚本。

希望有帮助!在Stackoverflow上进行搜索,内容脚本和背景页面有很多答案。

10-08 13:00