检测通过 window.open 打开的新窗口是否加载完成
技术百科
花韻仙語
发布时间:2026-01-27
浏览: 次 本文详解如何可靠检测 `window.open` 创建的弹出窗口是否完成加载,重点解决跨浏览器兼容性问题,并提供基于 `document.read

在 Web 开发中,使用 window.open() 动态创建新窗口后,常需在其内容加载完毕时执行样式修改、脚本注入或数据通信等操作。然而,直接监听 DOMContentLoaded 或设置 onload 回调往往失效——这是因为新窗口初始为空文档(about:blank),其 document 对象虽已存在,但事件监听器无法正确绑定到尚未构建完成的 DOM 上;同时,若新窗口跳转至跨域 URL,还会因同源策略限制而完全无法访问其 document。
最稳定、兼容性最佳的方案是轮询检查 document.readyState 状态。当 win.document.readyState === 'complete' 时,表示该窗口文档及其所有子资源(如 CSS、图片、内联脚本)均已加载完毕,此时可安全操作 DOM:
Opening window with JS
✅ 关键要点说明:
- 必须使用 setInterval + readyState === 'complete':这是目前唯一能在所有主流浏览器(Chrome/Firefox/Safari/Edge)中稳定工作的通用方案;
- 务必添加 try...catch:当新窗口加载跨域页面(如 https://example.com)时,访问 win.document 会触发 SecurityError,不捕获将导致脚本中断;
- 检查 win && !win.closed:防止窗口被用户手动关闭后仍继续轮询;
- 避免 win.onload 或 win.document.addEventListener('load'):这些事件在 window.open('', ...) 创建的空白窗口中不可靠,且不适用于后续 location.href 跳转场景;
- 不推荐 document.write() 注入 HTML:该方式会覆盖原始文档结构,破坏现代框架兼容性,且难以维护和调试。
⚠️ 注意事项:
- 若目标 URL 与当前页面不同源,你将无法读取或修改其 DOM,此时应改用 postMessage 进行跨窗口通信,并由子页面主动发送 'loaded' 消息;
- 轮询间隔不宜过短(如 10ms),否则可能造成不必要的 CPU 占用;50–200ms 是合理范围;
- 在生产环境建议封装为可复用函数,并支持超时机制(例如 10 秒未加载则自动清理)。
综上,document.readyState === 'complete' 配合轮询是检测 window.open 窗口加载完成的黄金标准——它不依赖事件绑定时机,不违反同源策略前提下的访问逻辑,且具备出色的浏览器兼容性。
# 还会
# 这是
# 能在
# 加载
# safari
# 文档
# 绑定
# 跳转
# 时应
# 你将
# 浏览器
# css
# win
# https
# edge
# js
# 对象
# html
# chrome
# access
# 事件
# 封装
# try
# catch
# dom
# location
# 跨域
# href
# firefox
# 数据通信
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何使用Golang实现函数指针_函数变量与回调示
- php485在php5.6下能用吗_php485旧
- Python包结构设计_大型项目组织解析【指导】
- c++的static关键字有什么用 静态变量和静态
- Python迭代器生成器进阶教程_节省内存与懒加载
- MAC怎么在照片中添加水印_MAC自带编辑工具文字
- Win11怎样安装搜狗输入法_Win11安装搜狗输
- Win10如何更改网络连接_Windows10以太
- Windows7怎么找回经典开始菜单_Window
- win11如何清理传递优化文件 Win11为C盘瘦
- 如何在 Go 中正确初始化结构体中的 map 字段
- Win11怎么制作U盘启动盘_Win11原版系统安
- Win10闹钟铃声怎么自定义 Win10闹钟自定义
- 如何使用Golang构建简易投票统计功能_Gola
- Win10如何优化内存使用_Win10内存优化技巧
- Python大文件处理策略_内存优化说明【指导】
- 如何使用Golang构建基础消息队列模拟_Gola
- 如何使用Golang实现跨域请求支持_Golang
- Windows11怎么自定义任务栏_Windows
- PHP 中如何在函数内持久修改引用变量所指向的目标
- 如何在Windows中创建新的用户账户?(标准与管
- c++如何实现多态性_c++ 虚函数表原理与动态绑
- Mac怎么设置鼠标滚动速度_Mac鼠标设置详细参数
- php本地部署支持nodejs吗_php与node
- Win11怎么关闭定位服务 Win11禁止应用获取
- Win11怎么看电池循环次数_Win11笔记本电池
- 如何使用Golang开发简单的聊天室消息存储_Go
- 如何在Golang中编写异步函数测试_Golang
- Windows10蓝屏代码DPC_WATCHDOG
- PHP主流架构怎么监控运行状态_工具推荐【操作】
- Golang如何避免指针逃逸_Golang逃逸分析
- Python文件操作优化_大文件与流处理解析【教程
- WindowsUSB驱动安装异常怎么办_USB驱动
- Windows10系统怎么查看CPU温度_Win1
- Windows10系统怎么查看运行时间_Win10
- 如何使用Golang模拟请求超时_Golang c
- c# F# 的 MailboxProcessor
- Python函数接口稳定性_版本演进解析【指导】
- Win11文件扩展名怎么显示_Win11查看文件后
- php删除数据怎么加限制_带where条件删除避免
- Python变量绑定机制_引用模型解析【教程】
- c++怎么实现高并发下的无锁队列_c++ std:
- Win11怎么设置开机问候语_自定义Win11锁屏
- C#怎么使用委托和事件 C# delegate与e
- Windows10电脑怎么查看硬盘通电时间_Win
- Win11怎么关闭边缘滑动手势_Windows11
- 如何在Golang中指定模块版本_使用go.mod
- Win11怎么设置任务栏对齐方式_Windows1
- 如何使用Golang实现文件加密_Golang c
- 如何使用Golang实现容器自动化运维_Golan

QQ客服