"交流"扩展名中的内容js和后台js文件

时间:2017-12-23 19:57:11

标签: javascript html google-chrome-extension

我正在编写扩展程序并遇到问题:我无法将扩展菜单中的数据发送到content.js。在扩展菜单中,我有几个直觉,在填写并单击按钮后,我写下他们的值,我想将它们发送到content.js,这些数据将用于{{1}中的实现但由于某种原因,数据不会被发送。



html

document.getElementById('btn').onclick = function() {
  var first = document.getElementById('first').value;
  var second = document.getElementById('second').value;
  //send in content
  chrome.extension.sendMessage('hello');
}




以下是<head> <script type="text/javascript" src="content.js"></script> <script type="text/javascript" src="background.js"></script> </head> <input type="text" id="first"> <input type="text" id="second"> <input type="button" id="btn" value="send">(可能存在错误)

manifest.json

{ "manifest_version": 2, "version": "1.3", "description": "name", "browser_action":{ "default_popup": "content/popup.html" }, "background": { "persistent": false, "scripts": ["content/background.js"] }, "content_scripts": [ { "matches": [ "https://google.com/*" ], "js": ["content/content.js"], "css": ["content/qq.css"], "run_at": "document_end" } ] } :从后台获取数据

content.js

我可以看到所有内容,chrome.extension.onMessage.addListener(function(request){ if(request=='hello'){ console.log('1. Принято: ', request); } }); 是扩展菜单中负责background.js的文件。 js是负责对网站上的DOM进行更改的文件。

4 个答案:

答案 0 :(得分:1)

我认为您正在寻找chrome / browser对象的runtime属性。

这将使您的发送消息命令chrome.runtime.sendMessage不使用extension属性。

同样,on message事件为chrome.runtime.onMessage

我从以下文档中提取此信息:https://developer.chrome.com/apps/messaging

答案 1 :(得分:1)

您的文件结构不清楚:popup.html的内容是什么?为什么要在同一页面加载content.jsbackground.js

以下是您尝试完成 我认为 的示例。

它的工作原理如下:

弹出屏幕将显示input s供用户填写。 按下按钮时,输入的值将发送到后台脚本,后台脚本又将它们发送到内容脚本。然后,内容脚本以您希望的方式使用这些值:例如,填充主机网页中的输入。

<强>的manifest.json

{

 "manifest_version": 2,
 "version": "1.3",
 "description": "name",
 "browser_action":{
    "default_popup": "content/popup.html"
 },
 "background": {
     "persistent": true,
     "scripts": ["content/background.js"]
 },
 "content_scripts": [
     {
         "matches": [ "https://google.com/*" ],
         "js": ["content/content.js"],
         "css": ["content/qq.css"],
         "run_at": "document_end"
     }
 ]
}

<强> background.js

var contentTabId;

chrome.runtime.onMessage.addListener(function(msg,sender) {
  if (msg.from == "content") {  //get content scripts tab id
    contentTabId = sender.tab.id;
  }
  if (msg.from == "popup" && contentTabId) {  //got message from popup
    chrome.tabs.sendMessage(contentTabId, {  //send it to content script
      from: "background",
      first: msg.first,
      second: msg.second
    });
  }
});

<强> content.js

chrome.runtime.sendMessage({from:"content"}); //first, tell the background page that this is the tab that wants to receive the messages.

chrome.runtime.onMessage.addListener(function(msg) {
  if (msg.from == "background") {
    var first = msg.first;
    var second = msg.second;
    //here you use the values as you wish, for example:
    //document.getElementById("anInput").value = first;
  }
});

<强> popup.html

<html>
  <body>
    <input type="text" id="first">
    <input type="text" id="second">
    <button id="send">Send</button>
    <script src="popup.js"></script>
  </body>
</html>

popup.js (此文件必须与popup.html位于同一目录中)

document.getElementById("send").onclick = function() {
  chrome.runtime.sendMessage({  //send a message to the background script
    from: "popup",
    first: document.getElementById("first").value,
    second: document.getElementById("second").value
  });
}

我希望有所帮助。

答案 2 :(得分:0)

content.js不应包含在popup.html中。只要网站与content.js中的模式匹配,就会运行manifest.json。目前,只要有人在安装了您的扩展程序的情况下访问google.com,content.js脚本就会在google.com的后台运行。

background.js也不应加载到弹出窗口中。这是一个总是在浏览器的后台运行的脚本,它不应该被任何东西加载。这是你添加代码之类的东西来改变多功能行为的行为。

您应该创建一个由popup.js包含的新popup.html脚本,它应该只处理实际弹出窗口的onload和onclick事件。

您提及的各种文件content.jsbackground.js以及您应创​​建的文件popup.js都有不同的作业,不应相互通信。既没有必要,也没有可能。如果你想要,例如获取其他网站中的内容的值,将其放在content.js中,该网站在与您的模式匹配的每个网站上运行,并在那里进行所有处理。

background.js =在浏览器中设置扩展程序的代码,例如更改多功能框行为。

content.js =在每个匹配特定模式的网站上运行的代码。

popup.js =当用户打开您的扩展程序的弹出窗口时运行的代码。

所以不要让他们沟通,他们不应该,他们填补完全不同的功能。

你也没有理由要求他们之间进行沟通,请解释你需要这个的场景,我会解释你为什么不需要它。 :)

答案 3 :(得分:0)

要与content.js通信,您需要使用chrome.tabs.sendMessage而不是chrome.extension.sendMessage,因为要与content.js通信,您需要提供 tabId ,在先前列出的API中作为参数传递。