如何在所有打开标签页执行Greasemonkey/Tampermonkey脚本函数?
能否在Greasemonkey/Tampermonkey中通过上下文菜单让所有标签页执行函数?
可以实现,但直接写location.reload()只能刷新当前标签页,要覆盖所有打开的标签页,得借助浏览器的标签页操作API,结合Tampermonkey(GM对这类API支持有限,更推荐用TM)的权限声明来做,下面是具体实现方法:
实现步骤
- 第一步:声明必要权限
在脚本的元数据块里,必须添加@grant chrome.tabs和@grant chrome.contextMenus权限,否则没法操作标签页和创建上下文菜单。示例元数据:
// ==UserScript== // @name 批量刷新所有标签页 // @version 0.1 // @description 右键菜单一键刷新所有打开的标签页 // @match *://*/* // @grant chrome.tabs // @grant chrome.contextMenus // ==/UserScript==
- 第二步:编写菜单与批量执行逻辑
创建上下文菜单,绑定点击事件后,查询所有标签页并逐个执行刷新操作:
(function() { 'use strict'; // 创建右键菜单 chrome.contextMenus.create({ id: "reloadAllTabs", title: "刷新所有标签页", contexts: ["all"] // 菜单可在任意场景触发,也可指定"page"等特定场景 }); // 绑定菜单点击事件 chrome.contextMenus.onClicked.addListener(function(info) { if (info.menuItemId === "reloadAllTabs") { // 查询所有已打开的标签页 chrome.tabs.query({}, function(tabs) { tabs.forEach(tab => { // 刷新单个标签页,bypassCache设为true可强制跳过缓存从服务器加载 chrome.tabs.reload(tab.id, {bypassCache: false}); }); }); } }); })();
注意点
- 优先用Tampermonkey:Greasemonkey对Chrome系API的支持不如Tampermonkey完善,Firefox用户可以把代码里的
chrome换成browser,权限声明对应改成@grant browser.tabs和@grant browser.contextMenus。 - 部分特殊标签页(比如浏览器设置页、默认新标签页)受浏览器权限限制,可能无法被脚本刷新。
内容的提问来源于stack exchange,提问作者Lionstrike
相关产品推荐
相关产品推荐

