gpt4 book ai didi

javascript - 后台脚本和页面(弹出)脚本之间如何通信?

转载 作者:行者123 更新时间:2023-12-02 14:07:30 24 4
gpt4 key购买 nike

如何从页面(弹出)脚本控制后台脚本中的变量?
为了每 10 秒获取资源,我在下面的代码中使用 setTimeout 循环。
但是当我取消选中弹出页面(browser_action)中的复选框时,下面的代码不会停止循环。

我预计当我(选中或取消选中)弹出窗口中的复选框时,page_script 会向后台脚本发送消息,如果后台收到 stop_loop 消息,后台脚本会更改 settimeout_loop_controller 设置为 false 以停止 settimeout 循环。

但是当我单击复选框时,此代码没有反应。

两个脚本之间如何通信?

let settimeout_loop_controller = true;

function fetching() {
if (settimeout_loop_controller) {
// if 'settimeout_loop_controller become false, the loop will stop.
fetch("http://url.com/example").then((getval) => { do_something })... ;
setTimeout(fetching, 10000);
} else {
return;
}
}

fetching();

chrome.runtime.onMessage.addListener((message) => {
if message.type === "stop_loop" {
settimeout_loop_controller = false;
}
else if (message.type === "start_loop") {
settimeout_loop_controller = true;
fetching();
}
});

弹出脚本:

let checkbox = document.getElementById("checkbox");

checkbox.onchange((e) => {
if (checkbox.checked) {
chrome.runtime.sendMessage({"type": "start_loop"});
}
else {
chrome.runtime.sendMessage({"type": "stop_loop"});
}
});

最佳答案

chrome.runtime.sendMessage API在页面脚本中不存在,但可以在内容脚本中访问。典型用法是使用 window.postMessage({"type": "stop_loop"},"*") 页面脚本将消息发布到内容脚本 ,然后在内容脚本中转发消息。
对于 Firefox 49 及更高版本,您可以 Sharing objects with page scripts 。例如,您可以定义一个函数 notify()exportFunction(notify, window, {defineAs:'notify'});首先在内容脚本中。页面脚本将能够调用window中公开的函数。对象。

window.notify("Message from the page script!");

关于javascript - 后台脚本和页面(弹出)脚本之间如何通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39919277/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com