本帖最后由 庶民 于 2023-6-13 13:07 编辑
@grant属性
可申请GM_*函数,none值 和 unsafeWindow权限;
更加详细的列表:
值为none的话,脚本就相当于直接运行在前端页面中(缺点:不能使用油猴提供的 GM_* 函数),反之就是脚本运行在一个沙盒环境,在这个沙盒中需要使用unsafeWindow去操作前端的元素;
默认的情况下,你的脚本运行在油猴给你创建的一个沙盒环境下,这个沙河环境无法访问到前端的页面,也就无法操作前端的一些元素等;
如果在页面最前方声明:"//@grant none",那么油猴就会将你的脚本直接放在前端的上下文中执行,这时的脚本上下文(window)就是前端的上下文,但是这样的话就无法使用GM_*等函数,无法与油猴交互,使用一些更强的功能.
所以一般写脚本的时候是使用 //@grant unsafeWindow 与前端交互,而不使用 //@grant none ,这样就可以使用grant去申请油猴的一些更强的函数功能.这时候的脚本上下文(window)是沙盒的上下文,而不是前端的上下文,而在沙盒环境中操作页面的window上下文时,就需要使用 unsafeWindow 代替 window;
在沙盒环境中,有一些window的操作也无法处理,需要使用grant来获取,例如:// @grant window.onurlchange (TamperMonkey文档中的),如下:
// ==UserScript==
...
// @grant unsafeWindow
// @grant window.onurlchange
// ==/UserScript==
if (window.onurlchange === null) {
// feature is supported
window.addEventListener('urlchange', (info) => ...);
}
这样的作法是为了避免恶意网页可以直接的使用 GM_* 函数,也可以避免被网页检测到 GM_* 插件的存在
GM文档内容:
unsafeWindow绕过Greasemonkey的安全模型,该模型的存在是为了确保恶意网页不能以这样的方式修改对象,从而使用户脚本(比在网页中运行的普通JavaScript具有更高的权限执行)执行其作者或用户不想做的事情。
|