Дождитесь полного ввода. js, прежде чем продолжить работу во всплывающем окне. js - PullRequest
1 голос
/ 06 января 2020

У меня проблема с моим расширением chrome, расширение считывает объект со страницы и отображает его содержимое во всплывающем окне. js.

Чтобы прочитать объект, всплывающее окно выполняет инъекции. js, которое, в свою очередь, внедряет скрипт. js.

Так что происходит, когда инъекция. js завершает выполнение всплывающего окна. Вызывается js обратный вызов и выполняется renderData(mydata). Я не хочу, чтобы это происходило до тех пор, пока скрипт не будет выполнен полностью. js полностью

Всплывающее окно. 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, "*");

1 Ответ

1 голос
/ 06 января 2020

Проблема в том, что executeScript возвращает последнее синхронно вычисленное выражение в качестве параметра обратного вызова, но script с src выполняется асинхронно. Кстати, вы забыли указать параметр.

Используйте textContent с буквенным кодом для синхронного запуска сценария и отправки сообщения DOM, которое также является синхронным, а затем оставьте результат в последнем выражении:

popup. js

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

inject. 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;

В качестве альтернативы вы можете использовать расширение сообщения для отправки данных во всплывающее окно ( пример ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...