一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

米侠浏览器脚本执行顺序冲突该怎样手动调整优先级?

时间:2026-06-26 10:34:54 编辑:袖梨 来源:一聚教程网

油猴脚本在米侠浏览器中因执行顺序错乱易引发功能覆盖等问题,需通过@run-at声明时机、调整启用顺序或合并脚本三种方式解决,核心是确保依赖脚本晚于被依赖脚本执行。

米侠浏览器中多个油猴脚本在同一个页面同时触发时,因执行顺序错乱导致功能覆盖、DOM劫持失败或变量污染,必须通过手动干预控制脚本实际运行次序。

确认脚本是否真的存在执行顺序冲突

打开开发者工具(F12)→ 切换到 Console 标签 → 刷新目标网页 → 观察报错信息是否含 “ReferenceError: xxx is not defined” 或 “Cannot read property ‘xxx’ of undefined”。若出现这类错误,且对应变量由另一个脚本声明,说明后者执行早于前者,【这是顺序冲突的铁证】

直接查看 Network → 过滤 JS 文件 → 检查各脚本加载时间戳:加载靠前 ≠ 执行靠前,油猴类脚本统一在 DOM 构建后注入,真正决定顺序的是 @run-at 声明与脚本管理器内部调度逻辑。

方法一:用 @run-at 显式指定注入时机

进入脚本管理器 → 点击问题脚本右侧“编辑” → 在元数据区块(// ==UserScript== 与 // ==/UserScript== 之间)添加或修改 @run-at 行:

@run-at document-start:脚本在 HTML 解析开始前注入,适合重写原生 API(如 fetch、XMLHttpRequest),但无法访问任何 DOM 节点;

@run-at document-idle:等 DOM 解析完成但未触发 load 事件时执行,适合多数 DOM 操作场景;

@run-at document-end:等 DOM 构建完毕、子资源(图片/CSS)尚未加载完时运行,兼容性最广;

@run-at document-ready:等 jQuery 的 $(document).ready() 级别时机,需确保页面已引入 jQuery 且脚本声明了 @require;

【关键原则:依赖其他脚本创建的全局变量或函数的脚本,必须设为比被依赖脚本更晚的 @run-at 时机】。例如 A 脚本挂载 window.myUtil,B 脚本调用 myUtil.doWork(),则 B 的 @run-at 必须晚于 A(如 A 用 document-idle,B 就用 document-end)。

方法二:调整脚本启用顺序并重启生效

这一步直接影响脚本管理器内部的执行队列排序,无需改代码:

第一步:在脚本管理器主界面,关闭所有待调整的脚本(点击开关变为灰色);

第二步:按你期望的执行先后顺序,依次点击脚本右侧开关——先点的脚本会排在执行队列更前面;

第三步:全部开启后,【必须完全退出米侠浏览器进程(Android 上要清后台,Windows/macOS 上任务管理器结束 mxx.exe)再重新启动】,否则顺序缓存不刷新;

第四步:刷新网页,用 console.log('A loaded') / console.log('B loaded') 验证输出顺序是否符合预期。

方法三:合并脚本或显式调用依赖项

当两个脚本存在强耦合(如一个提供工具函数,一个业务逻辑),硬拆成独立脚本反而增加顺序风险,此时应主动收编:

方法一:将工具类脚本内容复制进业务脚本顶部,删掉原工具脚本,彻底消除顺序依赖;

方法二:在业务脚本开头插入同步等待逻辑(仅限 document-end 及之后时机):

while (typeof window.myUtil === 'undefined') { /* 空循环 */ } // 不推荐,可能卡死页面

方法三(推荐):改用 Promise + MutationObserver 监听目标变量就绪:

const waitForUtil = () => new Promise(r => { const check = () => { if (typeof window.myUtil !== 'undefined') return r(); requestIdleCallback(check); }; check(); });
waitForUtil().then(() => { /* 此处放你的主逻辑 */ });

注意:该写法要求脚本 @run-at 至少为 document-end,否则 window 对象可能不可写。

热门栏目