检测新打开窗口的加载完成状态:JavaScript 实现可靠监听页面就绪
技术百科
花韻仙語
发布时间:2026-01-27
浏览: 次 本文介绍如何在使用 `window.open()` 创建新窗口后,准确、跨浏览器地检测其 dom 和资源是否完全加载,重点解决 `domcontentloaded` 和 `onload` 失效问题,并提供基于 `document.readystate === 'complete'` 的轮询方案。
当通过 window.open('', '_blank', ...) 打开一个空窗口(空白文档)时,许多开发者会尝试直接监听 win.document.addEventListener('DOMContentLoaded', ...) 或设置 win.onload —— 但这些方式通常失败。根本原因在于:新窗口初始文档为空(about:blank),且未显式写入内容前,其 document 对象尚未触发标准加载事件;同时,跨源限制和浏览器安全策略也导致事件监听器无法正确绑定或执行。
最可靠、兼容性最佳的解决方案是利用 document.readyState 属性配合轮询机制。根据 HTML 规范,readyState === 'complete' 表示文档及其所有子资源(如 CSS、图片、脚本)均已加载完毕,此时 load 事件即将触发——这正是我们所需的“页面真正就绪”信号。
以下为推荐实现(已优化健壮性):
Opening window with JS
✅ 关键要点说明:
- 必须使用 setInterval + readyState === 'complete':这是目前唯一能在 about:blank 窗口及后续导航中稳定工作的通用方法;
- 务必添加 try/catch:若子窗口跳转至不同源(如 https://example.com),直接访问 win.document 将抛出 SecurityError,不捕获会导致脚本中断;
- 加入超时机制:防止因网络异常、页面重定向失败等导致轮询长期挂起;
- 避免 document.write() 方案:该方法会清空原有文档并强制重置 readyState,且在现代浏览器中已被标记为不推荐(deprecated),还可能引发 CSP 违规;
- 不依赖 onload 绑定:对 window.open() 返回的 win 对象设置 win.onload 仅在窗口首次加载时有效,且对 about:blank 不触发,故不可靠。
总结:检测 window.open() 新窗口加载完成,应放弃事件监听幻想,转而采用受控轮询 document.readyState,辅以错误处理与超时防护,即可在主流浏览器中实现高兼容、高可用的加载状态感知。
# ai
# 这是
# 加载
# 所需
# 已被
# 文档
# 首次
# 绑定
# 浏览器
# css
# 器中
# 重定向
# win
# https
# js
# 对象
# javascript
# java
# html
# access
# 事件
# try
# catch
# 抛出
# dom
# 跨域
相关栏目:
<?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; ?>
】
相关推荐
- 作用域操作符会影响性能吗_php静态调用性能分析【
- Win10怎样清理C盘阿里旺旺缓存_Win10清理
- PHP主流架构怎么集成Redis缓存_配置步骤【方
- Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱
- LINUX如何删除用户和用户组_Linux use
- Win11任务栏怎么固定应用 Win11将软件图标
- mac怎么安装adb_MAC配置Android A
- Mac如何整理桌面文件_Mac使用堆栈功能一键整理
- 如何使用正则表达式批量替换重复的星号-短横模式为固
- 新手学PHP架构总混淆概念咋办_重点梳理【教程】
- PythonGIL机制理解_多线程限制解析【教程】
- Python网络超时处理_健壮性设计说明【指导】
- 如何在Golang中实现邮件发送功能_Golang
- VSC怎么配置PHP的Xdebug_远程调试设置步
- php内存溢出怎么排查_php内存限制调试与优化方
- Python项目回滚策略_发布安全说明【指导】
- 如何高效获取循环末次生成的 NumPy 数组最后一
- Win10怎么卸载金山毒霸_Win10彻底卸载金山
- 如何有效拦截拼接式恶意域名的垃圾信息
- 如何使用Golang实现多重错误处理_Golang
- Win11怎么设置右键刷新选项_Windows11
- Win10怎么卸载剪映_Win10彻底卸载剪映方法
- Python大型项目拆分策略_模块化解析【教程】
- Win11如何更新显卡驱动 Win11检查和安装设
- Win11色盲模式怎么开_Win11屏幕颜色滤镜设
- c++如何使用std::bitset进行位图算法_
- Win11怎么退出微软账户_切换Win11为本地账
- 如何使用Golang实现云原生应用弹性伸缩_自动应
- c++的STL算法库find怎么用 在容器中查找指
- 如何使用Golang实现容器安全扫描_Golang
- Win11怎么查看显卡显存_查询Win11显卡详细
- Windows任务计划服务异常原因_任务调度失败的
- Win11怎么关闭自动更新 Win11永久关闭系统
- Win11文件扩展名怎么显示_Win11查看文件后
- Linux如何使用grep搜索文件内容_Linux
- Mac电脑如何恢复出厂设置_Mac抹掉数据并重装系
- PhpStorm怎么调试PHP代码_PhpStor
- Python文件管理规范_工程实践说明【指导】
- Mac版Final Cut Pro入门_Mac视频
- c# 在ASP.NET Core中管理和取消后台任
- c++中如何使用std::variant_c++1
- 如何将竖排文本文件转换为横排字符串
- 如何使用Golang读取日志文件_Golang b
- Windows10系统服务优化指南_Win10禁用
- c++ stringstream用法详解_c++字
- Win11怎么修改DNS服务器 Win11设置DN
- Win11怎么设置默认图片查看器_Windows1
- php485在php5.6下能用吗_php485旧
- php485函数执行慢怎么优化_php485性能提
- 如何在 ACF 中正确更新嵌套多层的 Group

QQ客服