首页 > 解决方案 > 为什么 Tampermonkey 仍然可以识别以“window”为前缀的变量。在沙盒环境下不报错?

问题描述

理论上,下面的示例脚本会在沙箱中执行,所以应该不会被识别。但是为什么它可以成功关闭窗口而不报错呢?

其实我知道虽然可以跑,但也只是暂时的。在 unsafewindow 中,任何定义 window obj 的全局变量的尝试都将失败,除非它是在 unsafewindow 中定义的。

// ==UserScript==
// @name         temp
// @namespace    no
// @match        *:///*:/*/*
// @grant       unsafeWindow
// @grant window.close
// ==/UserScript==
window.close();

标签: javascriptgreasemonkeytampermonkey

解决方案


@grant在用户脚本中(在 GM|TM|VM 中)指的是特别提供给用户脚本的 GM API。

@grant window.close由 Tampermonkey 和 Violentmonkey 支持,它们将用户脚本中的window.close()函数映射到后台函数以关闭选项卡。

换句话说,window.close()在 VM|TM 中运行的content作用域与window.close()page上下文中运行的标准 JavaScript 不同。

此外,JavaScriptwindow.close()只能关闭由脚本打开的窗口(requires window.opener),而window.close()GM API 可以关闭窗口(选项卡),即使它不是由脚本打开的。


推荐阅读