发布于2026-07-26 阅读(0)
扫一扫,手机访问
米侠浏览器从v5.3升级到v5.5或v6系列后,不少用户发现之前运行得好好的脚本突然“罢工”了。控制台报错“undefined is not a function”,或者干脆静默跳过关键逻辑,让人摸不着头脑。问题的根源其实很简单:新版本解析器对UserScript元数据规范做了严格校验,那些非标准或已废弃的指令不再被兼容,直接就忽略了。

具体来说,升级后,@require、@grant none、@noframes、@include、@exclude、@run-at document-idle这些元数据指令全部失效。@require加载不了远程JS库,@grant none会触发安全拦截,@noframes被完全忽略,@include/@exclude被@match硬性替代,而@run-at document-idle则被解析成了document-start,导致DOM操作失败。所以,如果你的脚本还在用这些指令,必须全面重写。
打开你的脚本文件,在// ==UserScript==和==/UserScript==之间逐行检查。如果存在@require、@grant none、@noframes、@include、@exclude、@run-at document-idle等条目,它们在v5.5+中全部失效。这一步必须优先做,否则盲目重写可能引入新错误。
这里提供两种思路。第一种方法:将远程依赖库的内容直接复制进脚本顶部。找到原@require https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js这类行,删除它;用浏览器打开该URL,全选复制源码;回到脚本编辑页,在// ==UserScript==下方空行处粘贴整个jQuery代码,再接你的主逻辑。这样绕过网络加载,也规避了CSP拦截。
第二种方法:改用米侠内置的fetch + eval动态注入,但仅限可信源。把原@require行删掉,在脚本开头加一段同步加载逻辑:注意:此方式需确保目标CDN域名未被广告规则屏蔽,否则fetch返回空字符串
const jq = await fetch('https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js').then(r => r.text());eval(jq);
首先,把所有@grant行都删掉,包括@grant none、@grant unsafeWindow、@grant GM_xmlhttpRequest等。然后,只保留必需的权限。v5.5+只认以下四种有效值:【GM_setValue、GM_getValue、GM_deleteValue、GM_xmlhttpRequest】,其他如unsafeWindow、clipboardWrite等已移除,强行声明会导致整个脚本不加载。最后,如果脚本只需要操作页面DOM,无需声明任何@grant——v5.5+默认开放了document访问权限;如果需要跨域请求,必须显式写@grant GM_xmlhttpRequest并配合@connect白名单。
旧脚本中类似@exclude *://*.google.com/*的写法必须全部删掉,v5.5+不识别该指令,而且不会反向排除匹配。将原@match *://*.example.com/*替换为两行:
@match https://*.example.com/*
@match http://*.example.com/*
如果需要排除子路径,不能用@exclude,而要改用Ja vaScript条件判断:if (location.href.includes('/admin/') || location.hostname === 'test.example.com') return;
旧脚本如果没写@run-at,v5.5+默认按document-start执行,此时document.body为null,querySelector必然报错。在元数据块中插入且仅插入一行:@run-at document-end。这是操作DOM类脚本的唯一安全时机,v5.5+不支持document-idle、document-ready等别名,写错即失效。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
4
5
6
7
8
9