Выполнить функцию в скрипте содержимого, если ответ отправлен из 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-коммуникатор.