Javascript 仅运行一次通知脚本,即使脚本在多个选项卡上运行

Javascript 仅运行一次通知脚本,即使脚本在多个选项卡上运行,javascript,greasemonkey,tampermonkey,Javascript,Greasemonkey,Tampermonkey,我在Tampermonkey脚本中使用以下代码 function scriptMain () { setTimeout(function(){ GM_notification ( { title: 'Refresh Business Manager', text: 'Your about to be logged out of staging, click here to refresh your login.', image: 'https://

我在Tampermonkey脚本中使用以下代码

function scriptMain () {
    setTimeout(function(){
        GM_notification ( {
            title: 'Refresh Business Manager', text: 'Your about to be logged out of staging, click here to refresh your login.', image: 'https://i.stack.imgur.com/geLPT.png',
            onclick: () => {
                console.log ("My notice was clicked.");
                location.reload();
            }
        } );
    }, 5*1000);
    console.log ("Script main code ran.");
}
当浏览器选项卡打开超过5秒时,该代码将显示通知,其中包括刷新当前浏览器选项卡的按钮。我想用这个脚本每隔20分钟左右提醒我,浏览器中的一个登录即将自动注销

该功能如预期的那样工作,但是如果我从im登录的站点打开了5个选项卡,当页面即将用完时,我将收到5个通知。我希望能够从Tampermonkey脚本中判断这个脚本是否已经在另一个选项卡上运行,不执行,或者只显示一次通知

我一直在研究以下赠款的文件:

GM_getTab(callback)
GM_saveTab(tab)
GM_getTabs(callback)
但我似乎无法确定这个功能是否可行


有人能帮我了解一下这个话题吗,或者分享一个解决方案吗?

在符合现代规范的浏览器上,您可以在userscript内部使用它与同一域上的其他选项卡进行通信。使超时稍微随机-加上或减去几秒钟,以允许所有打开的选项卡协调。在发送通知时,还要在广播频道中发送一条消息,告知userscript的其他实例也重置其计时器

const channel = new BroadcastChannel('logout-notify');

let timeoutId;
function makeTimeout() {
    clearTimeout(timeoutId);
    timeoutId = setTimeout(function () {
        GM_notification({
            title: 'Refresh Business Manager', text: 'Your about to be logged out of staging, click here to refresh your login.', image: 'https://i.stack.imgur.com/geLPT.png',
            onclick: () => {
                console.log("My notice was clicked.");
                location.reload();
            }
        });
        channel.postMessage('notified');
    }, 1000 * 60 * 20 + (Math.random() * 10000)); // 20 minutes plus up to 10 seconds
}

// When below runs, another tab created a notification
// reset the timeout for this tab, schedule another one for 20ish minutes from now
channel.onmessage = makeTimeout;

// initialize timeout on pageload?
makeTimeout();

此代码将导致警报最多每20分钟显示一次。如果您关闭正在处理的一个选项卡,其他选项卡将不间断地占用空闲时间。

也许您可以使用本地存储来简单地保存一个标志,并检查是否设置了此标志:这正是我正在寻找的类型。非常感谢你。我尝试了这个脚本,但通知在某一点上似乎有点疯狂,因此它可能无法完全工作,但我可能能够找出原因:事实上,问题是,如果我在运行脚本的地方打开了10个窗口,并且所有窗口都同时打开,我会等待所有随机的10秒结束,我将连续收到10个通知,要求我逐个刷新每个选项卡。如果能够在第一次单击时将它们全部刷新,而不是连续显示所有10个通知,那就太好了。是否有
clearTimeout
调用和
1000*60*20+(Math.random()*10000)
用于随机超时时间?它不应该在20分钟内发出超过一次警报