javascript - Web 扩展:有没有办法将事件对象从 BrowserAction 传递到后台脚本?
问题描述
我在 BrowserAction 中有一个事件paste
,我需要将Event
对象或其clipboardData.items
属性发送到后台脚本。
我试过提取内容,但它不保留属性/方法。
任何普通对象都有效,但Event
对象不保留其值。
我也尝试过Object.assign
使用chrome.runtime.sendMessage()
.
非常感谢您的帮助,因为如果我不能让它工作,我所有的工作都会被扔进垃圾桶。
我的目标是从剪贴板读取图像文件,然后将其上传到网站。这是我遇到的问题的相关代码:
const body = document.querySelector('body');
body.addEventListener('paste', (event) => {
const item = [...event.clipboardData.items].pop();
const message = {
fn: 'pasteEvent',
text: item
}
chrome.runtime.sendMessage(message);
});
解决方案
好的,我想通了:你不能通过任何runtime.sendMessage
不能被序列化的东西。
因此,我使用的解决方法是创建一个DOMString
代表文件的对象 URL,将其传递给它sendMessage
,然后在另一端下载它。我不确定这是否是最好的方法,但它确实有效。
第 1 步:将剪贴板项目作为文件获取:
const item = [...event.clipboardData.items].pop();
const blob = item.getAsFile();
第 2 步:将其转换为对象 URL:
const objUrl = URL.createObjectURL(blob);
第 3 步:将其附加到消息并发送后,您必须下载文件并指定响应类型为blob
. 我使用了 Axios,但你可以使用任何东西:
async function getFile(objUrl) {
const config = {
responseType: 'blob'
};
const res = await axios.get(objUrl, config);
return res.data;
}