javascript - 等待 inject.js 完全执行,然后再继续 popup.js
问题描述
我的 chrome 扩展有问题,该扩展从页面中读取一个对象并在 popup.js 中显示其内容。
要读取对象,popup 会执行 injects.js,然后再注入 script.js。
所以发生的事情是,当 inject.js 完成执行时 popup.js 回调被调用并被renderData(mydata)
执行。在 script.js 完全执行之前,我不希望这种情况发生
Popup.js
chrome.tabs.executeScript(null, { file: "inject.js" }, function() {
renderData(mydata);
});
注入.js
var s = document.createElement("script");
s.src = chrome.runtime.getURL("script.js");
(document.head || document.documentElement).appendChild(s);
脚本.js
var data = {
type: "FROM_PAGE",
text: JSON.stringify(WIO.sessionInfo.context)
};
window.postMessage(data, "*");
解决方案
问题是 executeScript 返回最后一个同步计算的表达式作为回调的参数,但 a script
withsrc
异步运行。顺便说一句,您忘记指定参数。
使用textContent
with literal code 同步运行脚本并发送 DOM 消息,这也是同步的,然后将结果留在最后一个表达式中:
popup.js
chrome.tabs.executeScript(null, { file: "inject.js" }, ([mydata]) => {
renderData(mydata);
});
注入.js
var data;
var eventId = 'event' + Math.random();
document.addEventListener(eventId, e => {
data = JSON.parse(e.detail);
}, {once: true});
var script = document.createElement('script');
script.textContent = `(${eventId => {
var data = JSON.stringify(WIO.sessionInfo.context);
document.dispatchEvent(new CustomEvent(eventId, {detail: data}));
}})('${eventId}')`;
document.documentElement.appendChild(script);
script.remove();
data;
推荐阅读
- javascript - 在尝试将该参数中的值作为二维数组返回时,在以范围作为参数的 Google 表格自定义函数上,不会打印该值
- c# - 更改单元格值C#后如何在线更改datagridview中的行颜色?
- c++ - 如何在等宽 SDL2 TTF 中呈现文本
- ios - 表格视图单元格不显示相应的网站
- csvhelper - CSVHelper 双许可证
- json - Jolt transformation combining multiple values in an array of objects when multiple objects are in input
- c++ - 仅绑定到一种类型的转发引用?
- r - 如何对范围内的行进行分组并考虑第三列?
- java - 列出 Google 云端硬盘中的所有共享云端硬盘
- mysql - 为什么会出现“根据配置该节点应具有的主机名与本地接口不匹配”错误?