我制作了一个上下文菜单来执行 GM/TM 中的功能。是否可以在所有打开的选项卡中执行一个功能?
如果我用一个命令创建一个用户脚本,比如:
location.reload();
是否可以重新加载所有打开的选项卡?
有点,但也不是真的。
您可以使用
GM_setValue('X', 'Y');
来存储一个值。您可以尝试找到一种方法来创建一个允许您向选项卡发送信号以重新加载的通信协议。但我怀疑这个功能不是原子的,你很难确保选项卡不会重新加载两次,或者知道它们已经全部重新加载(或执行你需要的任何操作)。
第二个问题是浏览器完全或通过显着减慢事件循环来暂停选项卡,因此可能需要一段时间才能注意到消息。
如果你只是想让一个动作发生一次,不需要任何反馈,你可以试试这个伪代码:
function triggerAction(actionName) {
GM_setValue("newAction", {token:randomNumber(), action:actionName});
}
// main loop, this should be an async function
async main() {
while(true) {
await someDelayFunction(500 ms);
// check action
currentAction = GM_getValue("newAction");
// session storage is a per-tab permanent memory
if(sessionStorage.SCRIPT_lastActionToken != currentAction.token) {
sessionStorage.SCRIPT_lastActionToken = currentAction.token;
performAction(currentAction.action);
}
}
}
**注意:**这只是伪代码来说明这个想法。