Выполнить функцию в скрипте содержимого, если ответ отправлен из Background

Для моего расширения Chrome я пытаюсь опубликовать выделенный текст на веб-странице PHP. Решенный вопрос на этом веб-сайте ( расширение Chrome: как захватить выделенный текст и отправить в веб-службу) очень помог мне в достижении этого, но я хочу использовать другой способ публикации текста.
Вместо упомянутого там XMLHttpRequest я хочу отправить скрытую форму JS из скрипта содержимого. Этот метод позволяет мне просматривать или изменять текст, прежде чем импортировать его в базу данных.

Проблема состоит в том, чтобы получить триггер из фона в контентный скрипт. У меня уже есть сообщение об обратном, поэтому использование функции (ответа) желательно. Однако за пределами "sendMessage" я не могу прослушать response.cmd. А внутри "sendMessage" я не могу получить response.cmd для запуска функции. Есть ли решение для этого, кроме отправки всех новых сообщений из фонового скрипта? Код, на который я ссылаюсь:

Background.js

chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
  if(request.cmd == "createSelectionMenu") {
    sendResponse({cmd: "saveText"}); //Do things
  }
});

Content_script.js

chrome.extension.sendMessage({ cmd: "createSelectionMenu", data: selectedText },
  function(response) {
    if(response.cmd == "saveText") { 
      createForm();
    }
  }
});

1 ответ

Я делаю следующее:

Я отслеживаю свои открытые вкладки

контентный скрипт:

// connect to the background script
var port = chrome.extension.connect();

фоновый скрипт

// a tab requests connection to the background script
chrome.extension.onConnect.addListener(function(port) {
  var tabId = port.sender.tab.id;
  console.log('Received request from content script', port);

  // add tab when opened
  if (channelTabs.indexOf(tabId) == -1) {
    channelTabs.push(tabId);
  }

  // remove when closed/directed to another url
  port.onDisconnect.addListener(function() {
    channelTabs.splice(channelTabs.indexOf(tabId), 1);
  });
});

Теперь я могу уведомить все мои зарегистрированные вкладки (т.е. скрипты содержимого) из моего фонового скрипта, когда произошло определенное действие:

var notification = { foo: 'bar' };
for(var i = 0, len = channelTabs.length; i < len; i++) {
  chrome.tabs.sendMessage(channelTabs[i], notification, function(responseMessage) {
    // message coming back from content script
    console.log(responseMessage);
  });
}

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

chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
  if (request.foo == 'bar') {
    executeStuff();
    // if a callback is given:
    sendResponse && sendResponse('success');
  }
});

Это немного бред, потому что в некоторых местах это избыточно. Но мне это нравится больше всего, потому что вы можете обернуть его и сделать его немного легче.

Если вы хотите узнать, как я это использую, посмотрите мой репозиторий на GitHub: chrome-extension-коммуникатор.

Другие вопросы по тегам