窗口和运行时环境
窗口和运行时环境
某些文档假设存在浏览环境——窗口、位置、存储、事件。此层在纯 Python 中对这些对象进行建模,从而可以在服务器端处理此类文档,而无需浏览器。
窗口对象
Window 锚定环境,WindowEventLoop 驱动其事件处理,Screen、VisualViewport 和 BarProp 对显示相关状态进行建模。BrowsingContext 将窗口与其文档关联。
导航状态
Location 和 History 对地址和会话历史进行建模;Navigator 报告环境标识,可通过 set_default_user_agent() 配置。
事件
该 EventTarget 接口与 Event 家族 — CustomEvent、UIEvent、MouseEvent、KeyboardEvent、FocusEvent、InputEvent、PopStateEvent、HashChangeEvent、ErrorEvent — 实现了标准事件分发。AbortController 和 AbortSignal 提供取消功能。
存储和消息传递
Storage 对键值网页存储进行建模。MessageChannel、MessagePort 和 BroadcastChannel 覆盖消息传递,并在其背后使用结构化克隆助手(clone_value)。
观察者与性能
IntersectionObserver 和 ResizeObserver(及其入口类型)对观察 API 进行建模,而 Performance、PerformanceEntry 和 Console 则补全了常用的运行时服务脚本。
提示与最佳实践
- 仅在处理真正依赖环境状态的文档时才触及此层——解析和样式从不需要它。
- 在下游逻辑根据
Navigator身份进行分支时使用set_default_user_agent()。 - 将
AbortSignal接入长时间运行的处理,以实现优雅的取消
常见问题
| 问题 | 原因 | 修复 |
|---|---|---|
| 脚本期望全局 window 对象 | 文档面向浏览器编写 | 提供 Window 环境层 |
| 事件从不触发 | 没有事件循环驱动分发 | 使用 WindowEventLoop |
| User-agent 依赖的分支表现异常 | 默认 UA 字符串生效 | 通过 set_default_user_agent() 设置 |
FAQ
解析 HTML 是否需要 Window?
不 — 环境层是可选的;解析、CSSOM 和布局与其无关。
哪些事件类型被建模?
标准系列:UI、鼠标、键盘、焦点、输入、popstate、hashchange、错误以及自定义事件,全部通过 EventTarget 派发。
Web 存储是持久化的吗?
Storage 为处理目的对 API 表面进行建模;持久化取决于嵌入的应用程序。
API Reference 摘要
| 类/方法 | 描述 |
|---|---|
Window | 浏览环境锚点 |
Location | 地址状态 |
History | 会话历史 |
EventTarget | 事件分发接口 |
AbortController | 取消控制器 |
IntersectionObserver | 交叉观察 |
set_default_user_agent | 配置 Navigator 身份 |