Как передать функцию контент скритпу из backgound.js?
Я разрабатываю расширение для chrome, и когда я пытаюсь передать функцию контент скрипту из background.js, я получаю ошибку:
Uncaught (in promise) TypeError: response.sayHi is not a function
Файл background.js:
function sayHi() {
alert('hi')
}
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
if (request.action === "GET_CURRENT_TAB") {
sendResponse({ sayHi: sayHi });
}
});
Файл content-script.js:
(async () => {
const response = await chrome.runtime.sendMessage({
action: "GET_CURRENT_TAB",
});
response.sayHi();
})();
Ответы (1 шт):
Автор решения: versetty777
→ Ссылка
background.js:
let port = chrome.runtime.connect({ name: "my-channel" });
function sayHi() {
alert('hi');
}
port.onMessage.addListener(function (msg) {
if (msg.action === "GET_CURRENT_TAB") {
port.postMessage({ sayHi });
}
});
content-script.js:
let port = chrome.runtime.connect({ name: "my-channel" });
port.postMessage({ action: "GET_CURRENT_TAB" });
port.onMessage.addListener(function (msg) {
msg.sayHi();
});
Есть ещё один способ - использовать chrome.storage API, для хранения и извлечения пары ключ-значение:
background.js
chrome.storage.local.set({'sayHi': sayHi}, function() {
console.log('Function is set');
});
content-script.js
chrome.storage.local.get(['sayHi'], function(result) {
let func = result.sayHi;
func();
});