等待inject.js完全执行,然后再继续执行popup.js

时间:2020-01-06 16:23:06

标签: javascript google-chrome google-chrome-extension

我的chrome扩展程序有问题,扩展程序从页面读取对象,并在popup.js中显示其内容。

要读取对象,弹出窗口将执行injects.js,然后依次注入script.js。

所以发生的是,当inject.js完成执行时,将调用popup.js回调并renderData(mydata) 被执行。我不希望在完全执行script.js之前发生这种情况

Popup.js

chrome.tabs.executeScript(null, { file: "inject.js" }, function() {
  renderData(mydata);
});

inject.js

var s = document.createElement("script");
s.src = chrome.runtime.getURL("script.js");
(document.head || document.documentElement).appendChild(s);

script.js

 var data = {
    type: "FROM_PAGE",
    text: JSON.stringify(WIO.sessionInfo.context)
  };
  window.postMessage(data, "*");

1 个答案:

答案 0 :(得分:1)

问题在于,executeScript返回最后一个同步求值的表达式作为回调的参数,但是带有script的{​​{1}}异步运行。顺便说一句,您忘记了指定参数。

使用src和文字代码来同步运行脚本并发送DOM消息,该消息也是同步的,然后将结果保留在最后一个表达式中:

popup.js

textContent

inject.js

chrome.tabs.executeScript(null, { file: "inject.js" }, ([mydata]) => {
  renderData(mydata);
});

或者,您可以使用extension messaging将数据发送到弹出窗口(example)。