在chrome扩展中等待注入的脚本执行完成

uelo1irk  于 2021-09-13  发布在  Java
关注(0)|答案(0)|浏览(321)

我有这个函数,当我的popup.html中的某个按钮被点击时,它就会运行
popup.js

async function execute () {
    console.log("Executing...")
    const [tab] = await chrome.tabs.query({active: true, currentWindow: true});
    let res;
    try {
        res = await chrome.scripting.executeScript({
            target: {tabId: tab.id},
            files: ["/src/MainScript.js"],
        }, (a) => {
            console.log("Done callback?", a)
        });
    } catch (e) {
        return;
    }
    console.log("Result of script?", res)
}
``` `"Done callback?"` 及 `"Result of script?"` 在我运行后立即打印 `execute()` 所以我认为,它不是等待它的执行完成,而是加载文件🤔
我想执行这个命令 `MainScript.js` 文件并等待其执行完成。该文件如下所示:
mainscript.js

(async function () {
function Main () {
this.run = async function () {
// ...
}
}
const main = new Main();
await main.run();
})()

我想要达到的是,什么时候 `MainScript.js` 完成执行后,我想更改popup.html中的一些样式和元素。
我想知道如何真正等待执行完成,或者从 `MainScript.js` 对于我的popup.js,不管是以何种方式还是其他方式,我对一切都敞开了心扉
编辑
我尝试了消息传递的方法,因为我无法等待清单v3(ty woxxom)中的执行完成:
在…的结尾 `MainScript.js` 我把这个

const main = new Main();
await main.run();

chrome.runtime.sendMessage(myExtensionId, {type: 'processDone', value: true});

然后在 `background.js` 我在听这个消息

chrome.runtime.onMessageExternal.addListener(
function(request, sender, sendResponse) {
console.log("Hello background", request);
// Set loading to false in localStorage...
}
);

侦听器从未被触发,但当我通过控制台手动键入sendmessage时,它会按预期工作,service worker控制台会打印 `"Hello background"` 如何从内容脚本发送消息( `MainScript.js` )给服务人员 `background.js` ??
以防万一,这是我的manifest.json

{
"name": "Extension name",
"description": "Build an Extension!",
"version": "1.0",
"manifest_version": 3,
"background": {
"service_worker": "background.js"
},
"action": {
"default_popup": "popup.html",
"default_icon": "/images/favicon-32x32.png",
"default_title": "Title"
},
"permissions": [
"activeTab",
"tabs",
"webNavigation",
"scripting",
"storage"
],
"externally_connectable": {
"ids": [
"*"
],
"matches": [
"https://.google.com/"
]
},
"host_permissions": [
"http:///", "https:///"
]
}

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题