讲师中心 微信公众号
AI工具推荐 视频效率加速

如何检测通过 window.open() 打开的新窗口是否完成加载

千明小哥_3280

千明小哥_3280

发布时间:2026-01-27 15:44:03

|

201人浏览过

|

来源于php中文网

原创

如何检测通过 window.open() 打开的新窗口是否完成加载

本文介绍在跨域受限环境下,使用 `document.readystate === 'complete'` 配合轮询机制可靠检测 `window.open()` 打开的子窗口加载完成的方法,并提供可直接运行的完整示例与关键注意事项。

在 Web 开发中,通过 window.open() 创建新窗口后,常需在其 DOM 就绪或资源完全加载后执行操作(如修改样式、注入脚本、通信等)。但直接监听 DOMContentLoaded 或 load 事件往往失败——根本原因在于:当 window.open('') 打开一个空窗口(about:blank)时,其 document 对象虽已存在,但事件监听器无法正确绑定到尚未完全初始化的跨上下文文档中;更关键的是,若目标页面与父页不同源(如打开外部 URL),浏览器会因同源策略禁止访问子窗口的 document 和事件系统,导致所有基于事件的方案失效。

因此,最兼容、最可靠的方案是采用 document.readyState 轮询法:

  • document.readyState 有三个值:'loading'、'interactive'、'complete';
  • 'complete' 表示文档及所有依赖资源(CSS、图片、子框架等)均已加载完毕,等效于 window.onload 触发时机;
  • 对新开的 about:blank 窗口,该属性可安全读取(同源前提下),且无需事件绑定。

以下为经过验证的完整实现:

HTML汇报生成器
HTML汇报生成器

🚀 不用写一行代码!把项目总结、工作汇报、研究报告、技术文档、提案、数据看板直接变精美HTML。12种主题 × 11种背景动效 × 9种鼠标特效 × 10种边框样式 × 实时调色器 × 毛玻璃卡片 × PDF导出,生成后还能自由调色,零门槛AI直出。触发词:项目总结、工作汇报、PPT、生成报告、做个总结、HTML文档、数据报告、流程文档、会议纪要、技术文档、研究报告、数据看板、提案、做个展示页、帮我做个汇报、文档生成。

下载
<!DOCTYPE html>
<html>
<head>
  <title>Opening window with JS</title>
  <script>
    const openWindow = () => {
      // 打开一个空白窗口(同源上下文)
      const win = window.open('', '_blank', 'top=20,left=20,width=200,height=200');

      // 启动轮询,检查子窗口 document.readyState
      const intervalId = setInterval(() => {
        try {
          // 注意:必须用 try-catch —— 若窗口被关闭或跨域,访问 win.document 会抛出 SecurityError
          if (win && !win.closed && win.document && win.document.readyState === 'complete') {
            clearInterval(intervalId);
            console.info('Child window loaded successfully');
            win.document.body.style.background = 'hotpink';
            win.document.title = 'Loaded!';
          }
        } catch (e) {
          // 跨域或窗口异常时静默处理(可选:记录警告)
          if (e.name === 'SecurityError') {
            console.warn('Cannot access child window: cross-origin restriction.');
            clearInterval(intervalId);
          }
        }
      }, 100); // 每100ms检查一次,兼顾响应性与性能
    };

    document.addEventListener('DOMContentLoaded', () => {
      document.getElementById('open').addEventListener('click', openWindow);
    });
  </script>
</head>
<body>
  <button id="open">Open window</button>
</body>
</html>

✅ 关键要点说明:

  • 必须加 try...catch:当子窗口加载的是跨域页面(如 https://example.com)时,访问 win.document 会立即抛出 SecurityError,不捕获将导致脚本中断;
  • 检查 win.closed:防止轮询期间用户手动关闭窗口,避免内存泄漏或错误操作;
  • 轮询间隔建议 50–200ms:过短增加 CPU 负担,过长影响响应及时性;
  • 仅适用于同源场景的深度控制:若需与跨域子页通信,请改用 postMessage() + message 事件(需子页主动配合);
  • 不推荐 document.write() 方案:它会覆盖整个文档、重置状态,且现代浏览器中易触发 CSP 限制,可维护性差。

总结:readyState === 'complete' 轮询是当前最稳定、无依赖、广泛兼容的子窗口加载检测方式。它绕过了事件绑定的不确定性,直击加载完成的本质状态,是生产环境值得信赖的选择。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

6521

2024.08.14

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

5430

2024.08.16

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

0

2026.10.16

OpenJDK怎么配置Java开发环境
OpenJDK怎么配置Java开发环境

怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。

0

2026.10.16

OpenJDK怎么部署Java应用
OpenJDK怎么部署Java应用

Java项目开发完成后,怎样部署到目标环境并正常运行?本专题介绍OpenJDK应用部署流程,涵盖运行环境准备、版本兼容检查、应用打包、启动参数配置和日志查看,帮助你理清部署前后的操作顺序,减少环境差异造成的运行问题。

0

2026.10.16

Revel框架模板渲染与表单验证
Revel框架模板渲染与表单验证

本专题围绕Revel框架视图层开发,介绍模板语法、变量输出、布局复用、表单提交、参数绑定与验证规则,帮助开发者完成安全规范的页面交互。

0

2026.10.16

Revel框架MVC路由与控制器
Revel框架MVC路由与控制器

本专题聚焦Revel框架MVC核心机制,讲解路由定义、控制器Action、参数绑定、请求响应和反向路由,并结合常见场景梳理接口请求处理流程。

0

2026.10.16

Revel框架入门与安装配置
Revel框架入门与安装配置

本专题从Revel框架环境搭建讲起,系统介绍命令行工具安装、项目创建、目录结构、配置文件及热代码重载,帮助开发者快速完成首个Go Web应用。

0

2026.10.16

Linux 新手先学哪些命令
Linux 新手先学哪些命令

Linux新手命令专题汇集终端基础、文件目录操作、文本查看、软件安装和权限管理等入门文章,帮助按实际任务练习常用命令并建立命令行操作习惯。

20

2026.10.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 1.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 6万人学习

CSS教程
CSS教程

共754课时 | 97.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn