如何在网页中调用Tampermonkey用户脚本函数关闭当前标签页
解决方案
1. 修正Tampermonkey脚本配置与逻辑
你当前脚本的@grant none和@grant window.close配置存在冲突:@grant none会强制用户脚本运行在页面公共上下文,此时你申请的关闭权限不会生效,调用window.close和页面自身调用完全等价,必然触发安全限制报错。
删除@grant none配置,改用自定义事件监听页面的关闭请求,修改后脚本如下:
// ==UserScript== // @name Demo // @namespace http://tampermonkey.net/ // @match * // @grant window.close // @run-at document-start // ==/UserScript== // 监听页面发送的自定义关闭事件 document.addEventListener('requestCloseTab', () => { // 此处调用的是Tampermonkey授予特权的window.close API,绕过普通页面的安全限制 window.close(); })
可选安全优化:如果需要限制只有指定域名的页面能触发关闭操作,可以增加域名校验逻辑:
document.addEventListener('requestCloseTab', () => { // 替换为你允许触发关闭的域名 if (window.location.hostname === 'example.com') { window.close(); } })
2. 调整网页侧调用逻辑
用户脚本运行在独立沙箱上下文时,页面无法直接访问脚本内定义的函数,改为通过触发自定义事件和脚本通信即可:
<html> <body> <script> // 触发自定义事件,通知用户脚本执行关闭操作 document.dispatchEvent(new Event('requestCloseTab')); </script> </body> </html>
核心原理
移除@grant none后,Tampermonkey会将脚本运行在独立的沙箱环境,你申请的window.close权限会作为特权API生效,该API调用的是浏览器扩展级别的权限,不会触发「脚本只能关闭自己打开的窗口」的普通页面安全限制。自定义事件是沙箱上下文和页面上下文之间通信的标准方案,不会破坏上下文隔离性,也能稳定传递操作指令。
内容的提问来源于stack exchange,提问作者Nebu
相关产品推荐
相关产品推荐

