我正在学习构建 Chrome 扩展程序,并且正在尝试遵循此处官方指南中的说明之一。
我想要完成的是:
- background.js 显示目标 URL 的页面操作。
- 页面操作在单击时执行脚本。
- 执行的脚本在页面上注入 javascript。
到目前为止,一切都很好!我使用以下脚本注入页面。
var injectJS = function(url, cb) {
var h = document.getElementsByTagName('head')[0],
s = document.createElement('script');
s.type = 'text/javascript';
s.src = url;
if (cb)
s.onload = cb;
h.appendChild(s);
};
injectJS(chrome.extension.getURL('script/do_something.js'));
现在,我希望注入的脚本能够与扩展通信。
看来我正在寻找的是文档中描述的内容。
https://developer.chrome.com/extensions/content_scripts.html#host-page-communication
问题是,当我尝试执行window.postMessage
控制台显示错误“DOM Exception 12”时。
编辑:运行示例代码的第一个问题已解决。
我从 smae 代码中得到的另一个错误来自port.postMessage
:
Uncaught Error: Attempting to use a disconnected port object
这是代码:
var port = chrome.runtime.connect();
// Respond to messages from the injected script to collect results
window.addEventListener('message', function(e) {
if (e.source != window)
return;
if (e.data.type && (e.data.type == 'FROM_PAGE')) {
console.log('Content script received: %s', e.data.text);
port.postMessage(e.data.text);
}
}, false);
基本上我试图在页面重新加载时暂时保留一些数据。内容脚本/注入脚本收集数据,然后加载下一页。后台脚本应该保存结果,直到所有页面都已加载。