在我的扩展程序中,我需要将一些数据从一个标签的内容脚本传输到另一个标签的内容脚本。如果我知道该标签对象的名称或网址的一部分,我如何使用chrome.tabs选择某个标签?两个标签的脚本如何通信?
更新
显然我在chrome.extension中没有方法sendMessage。当我从内容脚本运行以下内容时:
chrome.extension.sendMessage("message");
我进入控制台:
未捕获TypeError:Object#没有方法'sendMessage'
答案 0 :(得分:5)
首先,请注意在扩展中传递的消息是JSON序列化的。消息中不包含不可序列化的类型,例如函数。
在内容脚本中,您必须将消息传递到后台页面,因为没有方法可以直接访问其他选项卡。
// Example: Send a string. Often, you send an object, which includes
// additional information, eg {method:'userdefined', data:'thevalue'}
chrome.extension.sendMessage(' ... message ... ');
在background page中,使用chrome.tabs.query
方法获取标签的ID。为了简单的例子,我已经对模式和网址进行了硬编码。以这种方式包含上一条消息中的查询值可能是个好主意:{query:{...}, data:...}
。
// background script:
chrome.extension.onMessage.addListener(function(details) {
chrome.tabs.query({
title: "title pattern",
url: "http://domain/*urlpattern*"
}, function(result) {
// result is an array of tab.Tabs
if (result.length === 1) { // There's exactely one tab matching the query.
var tab = result[0];
// details.message holds the original message
chrome.tabs.sendMessage(tab.id, details.message);
}
});
});
chrome.tabs.sendMessage
用于将原始数据传递到其他标签页。
备注:在示例中,我仅在查询生成一个唯一选项卡时传递了消息。如果唯一性不是先决条件,则只需使用result.forEach
或:
for (var i=0, tab; i<result.length; i++) {
tab = results[i];
...
}
答案 1 :(得分:1)
从内容脚本中,您只能与后台进程通信。 您可以使用背景作为中间文件在不同选项卡中的两个内容脚本之间进行通信。
此外,DOM提供了在DOM窗口之间进行通信的其他方式,但具有相同的原始策略...
要获取标签的网址,您可以在其上执行内容脚本。内容脚本可以使用window.location.href
获取url