tampermonkey 中文文档 下载 App

用 run-at 控制用户脚本的注入时机

页面加载是分阶段的:HTML 结构先到,样式渲染,图片后到。脚本在哪个阶段被注入,直接影响它能不能找到要操作的元素。@run-at 就是声明这个时机的字段——官方文档强调,它定义的是「脚本最早希望运行的时刻」。

四个常规取值

取值注入时刻适用
document-start尽可能早,页面还没成形要抢在页面脚本前干预(如改写变量、提前埋钩子)
document-bodybody 元素出现时要挂载 UI 到 body 的脚本
document-endDOMContentLoaded 触发时操作 DOM 结构的常规脚本
document-idleDOMContentLoaded 之后默认值——不写 @run-at 时按这个算

还有第五个特殊值 @run-at context-menu(较新版本引入):脚本不随页面自动运行,等你在右键菜单或弹出菜单里点它才执行,且此模式下 include/exclude 声明被忽略。适合「按需触发」的脚本。

选择建议

与 @require 的相互作用

官方文档明确提到一个细节:如果脚本用 @require 挂了外部库,下载库文件可能耗时,脚本实际执行会晚于声明的 @run-at——「最早时刻」不保证「准点到达」。

事件缓存机制

官方描述:在声明的注入时刻之后发生的 DOM 插入、DOMContentLoaded、load 事件会被缓存,再派发给脚本里注册的监听器——所以 document-start 注入的脚本也不会错过 load 事件,放心写事件监听。

调试时机问题

「元素找不到」类报错,先确认脚本的注入时机和元素出现时机的先后关系:

  1. 看头部 @run-at 值;
  2. 开发者工具里对比元素实际出现时间;
  3. 需要看扩展侧日志时开调试级别,见调试日志。

相关页面