javascript - 建立内容脚本和后台页面之间的通信链接

标签 javascript google-chrome google-chrome-extension background-process

使用 javascript 开发 Chrome 扩展是我的大学项目之一。

我不知道如何使用消息传递在内容脚本和后台页面之间建立通信链接。我需要一些帮助来建立连接

背景.html

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

content_script.js

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) { 
    if (request.method == "getHTML") 
        sendResponse({data: document.getElementById('header').innerHTML}); 
    else sendResponse({}); 
});

最佳答案

几个主要问题:

  1. 您依赖于页面上具有 ID header 的某些元素。此类 ID 由网站设计者自行决定,因此实际上很少有页面(包括 Google)拥有该 ID。也许可以选择更通用的内容,例如页面标题 (document.title)。
  2. “扩展按钮”是什么意思?如果它意味着浏览器操作,那么它就是您的扩展的一部分,因此您想要从后台脚本发送某些内容是正确的。这也是一个更简单的情况,因为很可能(除了上述没有包含 ID header 元素的 Google 页面的问题之外),您只是没有捕获 browser action click event 。然而,如果它是某个注入(inject)的按钮,那就相反了。

你想要什么(浏览器操作版本)

background.html(内联):

chrome.browserAction.onClicked.addListener(function(tab) {
  chrome.tabs.getSelected(null, function(tab) {
    chrome.tabs.sendRequest(tab.id, { method: "getHTML"}, function(response) {
      console.log(response.data);
    });
  });
});

content_script.js

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
  if (request.method === "getHTML") {
    sendResponse({data: document.title});
  } else {
    sendResponse({});
  }
});

您可能想要什么(注入(inject)按钮点击版本)

背景.html:

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
  if (request.method === "getHTML") {
    console.log(request.data);
  }
});

content_script.js:

function buttonClick() {
  chrome.extension.sendRequest({method: "getHTML", data: document.title});
}

下面评论的回复代码

非常重要的推荐:Chrome's developer reference可能是那里最友好的之一。如果您想了解 chrome.* API 的哪些部分可用,请从这里开始。

function getHtml(tabId) {
  chrome.tabs.sendRequest(tabId, { method: "getHTML"}, function(response) {
    console.log(response.data);
  });
}

// Note that this will only work once a tab has loaded
chrome.tabs.onSelectionChanged.addListener(function(tabId) {
  getHtml(tabId);
});

// This fires the first time a page is loaded
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo) {
  if (changeInfo.status === "complete") {
    getHtml(tabId);
  }
});

下面评论的第二个回复的代码

背景.html

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
  if (request.method === "getHTML") {
    console.log(request.data);
  }
});

content_script.js

document.addEventListener("keypress", function(e) {
  chrome.extension.sendRequest({method: "getHTML", data: e.which});
});

关于javascript - 建立内容脚本和后台页面之间的通信链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6224922/

相关文章:

html - Chrome 没有正确定位按钮

javascript - 构建 HTML5 音频流 Chrome 扩展 - 如何停止缓冲流

javascript - 如何检测用户何时打开浏览器?

JavaScript 正则表达式

javascript - 背景图像与滚动内容一起移动

jquery position() 在 chrome 中不起作用

javascript - 刷新 Chrome 时出现问题

javascript - jQuery onclick 错误函数

javascript - 当人们点击后退按钮时,如何防止浏览器执行一些 JavaScript?

javascript - JSON 未定义,Chrome