子页面和dialog案例
!DOCTYPE htmlhtmllangzh-CNheadmetacharsetUTF-8metanameviewportcontentwidthdevice-width, initial-scale1.0title子HTML弹窗 与 弹框 传参demo单文件/titlestyle:root{--primary:#4f6ef7;--primary-dark:#3b55d9;--bg:#f4f6fb;--card:#ffffff;--text:#1f2430;--text-secondary:#6b7280;--border:#e5e7eb;--success-bg:#eafaf0;--success-text:#1a7f4e;--radius:14px;}*{box-sizing:border-box;}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Microsoft YaHei,sans-serif;background:var(--bg);color:var(--text);padding:40px 20px;}.container{max-width:760px;margin:0 auto;}h1{font-size:24px;font-weight:600;margin:006px;}.subtitle{color:var(--text-secondary);font-size:14px;margin:0032px;}.grid{display:grid;grid-template-columns:1fr 1fr;gap:20px;}media(max-width:640px){.grid{grid-template-columns:1fr;}}.card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);padding:24px;display:flex;flex-direction:column;gap:14px;box-shadow:0 1px 3px rgba(0,0,0,0.04);}.card h2{font-size:16px;margin:0;display:flex;align-items:center;gap:8px;}.card p{font-size:13px;color:var(--text-secondary);margin:0;line-height:1.6;flex:1;}.badge{display:inline-block;font-size:11px;padding:3px 8px;border-radius:999px;background:#eef1ff;color:var(--primary-dark);width:fit-content;}button.action{background:var(--primary);color:#fff;border:none;border-radius:10px;padding:10px 16px;font-size:14px;cursor:pointer;transition:background .15s ease, transform .1s ease;}button.action:hover{background:var(--primary-dark);}button.action:active{transform:scale(0.98);}.result-box{margin-top:28px;background:var(--card);border:1px solid var(--border);border-radius:var(--radius);padding:20px 24px;}.result-box h3{font-size:14px;margin:0012px;color:var(--text-secondary);font-weight:500;}.result-item{display:none;align-items:center;gap:10px;background:var(--success-bg);color:var(--success-text);padding:10px 14px;border-radius:10px;font-size:13px;margin-bottom:8px;}.result-item.show{display:flex;}.result-empty{font-size:13px;color:var(--text-secondary);}/* ---- 弹框模态对话框样式 ---- */ dialog{border:none;border-radius:16px;padding:0;width:min(380px,92vw);box-shadow:0 20px 60px rgba(0,0,0,0.18);}dialog::backdrop{background:rgba(20,20,30,0.35);}.modal-inner{padding:24px;}.modal-inner h3{margin:004px;font-size:17px;}.modal-inner .modal-sub{font-size:13px;color:var(--text-secondary);margin:0018px;}.field{margin-bottom:14px;}.field label{display:block;font-size:12px;color:var(--text-secondary);margin-bottom:6px;}.field input{width:100%;padding:9px 12px;border:1px solid var(--border);border-radius:8px;font-size:14px;outline:none;}.field input:focus{border-color:var(--primary);}.modal-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:20px;}button.ghost{background:transparent;border:1px solid var(--border);border-radius:10px;padding:9px 16px;font-size:14px;cursor:pointer;color:var(--text);}button.ghost:hover{background:#f3f4f6;}/* ---- 代码片段展示 ---- */ pre.code{background:#1e2230;color:#e3e6f0;border-radius:10px;padding:14px 16px;font-size:12.5px;line-height:1.6;overflow-x:auto;margin:0;font-family:SFMono-Regular,Consolas,Courier New,monospace;}pre.code .kw{color:#7aa2f7;}pre.code .fn{color:#c0caf5;}pre.code .str{color:#9ece6a;}pre.code .com{color:#6b7280;}/style/headbodydivclasscontainerh1主页面单文件demo/h1pclasssubtitle演示两种向主页面传参的方式弹出子HTML窗口 vs 页内弹框全部写在同一个 html 文件里/pdivclassgriddivclasscardspanclassbadgewindow.open/spanh2① 打开子HTML页面/h2p点击后用 Blob 动态生成一个独立子页面并以弹出窗口形式打开不是新标签页。在子页面填写信息提交后通过 postMessage 把数据传回本页面随后子窗口自动关闭。/pbuttonclassactionidopenChildBtn打开子页面/buttonpreclasscodespanclasscom// 子页面打开弹出窗口/spanspanclasskwconst/spanurlURL.createObjectURL(blob);spanclassfnwindow.open/span(url,spanclassstrchildWindow/span,spanclassstrwidth380,height380/span);spanclasscom// 子页面把数据传回主页面/spanwindow.opener.spanclassfnpostMessage/span({type:spanclassstrCHILD_SUBMIT/span, payload: data},spanclassstr*/span);spanclasscom// 主页面接收数据/spanwindow.spanclassfnaddEventListener/span(spanclassstrmessage/span, e{spanclasskwconst/spandatae.data.payload;});/pre/divdivclasscardspanclassbadgelt;dialoggt;/spanh2② 打开弹框/h2p点击后在当前页面内弹出模态对话框不产生新窗口。填写并提交后直接调用主页面函数拿到数据。/pbuttonclassactionidopenModalBtn打开弹框/buttonpreclasscodespanclasscom// HTML弹框本体与主页面同属一个DOM/spanlt;spanclasskwdialog/spanidspanclassstrmyModal/spangt;...lt;/spanclasskwdialog/spangt;spanclasscom// 打开弹框/spanmodal.spanclassfnshowModal/span();spanclasscom// 提交时直接读取同页面的表单值/spanform.spanclassfnaddEventListener/span(spanclassstrsubmit/span, e{spanclasskwconst/spannamenameInput.value;spanclasscom// 无需跨窗口通信直接使用/span});/pre/div/divdivclassresult-boxh3接收到的数据/h3divclassresult-itemidchildResult/divdivclassresult-itemidmodalResult/divpclassresult-emptyidemptyTip暂无数据试试上面两个按钮/p/div/div!-- 弹框模态对话框本体与主页面同属一个DOM --dialogidmyModaldivclassmodal-innerh3填写信息弹框/h3pclassmodal-sub提交后数据直接传回主页面不会离开当前页面/pformidmodalFormmethoddialogdivclassfieldlabel姓名/labelinputtypetextidmodalNamerequiredplaceholder请输入姓名/divdivclassfieldlabel备注/labelinputtypetextidmodalNoteplaceholder选填/divdivclassmodal-actionsbuttontypebuttonclassghostidcancelModal取消/buttonbuttontypesubmitclassaction提交/button/div/form/div/dialogscriptvar emptyTipdocument.getElementById(emptyTip);var childResultdocument.getElementById(childResult);var modalResultdocument.getElementById(modalResult);functionshowResult(el, text){el.textContenttext;el.classList.add(show);emptyTip.style.displaynone;}// ---- ① 打开子HTML页面弹出窗口用 Blob 动态生成不需要单独的 html 文件 ---- document.getElementById(openChildBtn).addEventListener(click,function(){var childHtml[!DOCTYPE htmlhtml langzh-CNheadmeta charsetUTF-8,title子页面/title,style,body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Microsoft YaHei,sans-serif;background:#fff;color:#1f2430;padding:22px;},h2{font-size:16px;margin:0 0 4px;},.sub{font-size:12px;color:#6b7280;margin:0 0 18px;},.field{margin-bottom:14px;},.field label{display:block;font-size:12px;color:#6b7280;margin-bottom:6px;},.field input{width:100%;padding:9px 12px;border:1px solid #e5e7eb;border-radius:8px;font-size:14px;box-sizing:border-box;outline:none;},.field input:focus{border-color:#4f6ef7;},.actions{display:flex;justify-content:flex-end;gap:8px;margin-top:20px;},button{border-radius:10px;padding:9px 16px;font-size:14px;cursor:pointer;border:1px solid #e5e7eb;background:#fff;color:#1f2430;},button.primary{background:#4f6ef7;color:#fff;border:none;},button.primary:hover{background:#3b55d9;},button:hover{background:#f3f4f6;},/style/headbody,h2我是子HTML页面/h2,p classsub这是一个独立的弹出窗口提交后会把数据传回打开它的主页面/p,form idchildForm,div classfieldlabel姓名/labelinput typetext idname required placeholder请输入姓名/div,div classfieldlabel邮箱/labelinput typeemail idemail required placeholder请输入邮箱/div,div classactionsbutton typebutton idcloseBtn取消/buttonbutton typesubmit classprimary提交并关闭/button/div,/form,script,document.getElementById(closeBtn).addEventListener(click, function(){ window.close(); });,document.getElementById(childForm).addEventListener(submit, function(e){, e.preventDefault();, var data { name: document.getElementById(name).value, email: document.getElementById(email).value };, if(window.opener){ window.opener.postMessage({ type: CHILD_SUBMIT, payload: data }, *); }, window.close();,});,\/script,/body/html].join();var blobnew Blob([childHtml],{type:text/html});var urlURL.createObjectURL(blob);// width/height 等参数是让浏览器以弹出窗口而非新标签页打开的关键 window.open(url,childWindow,width380,height380,left200,top150);});// 监听子窗口通过 postMessage 传回的数据 window.addEventListener(message, function(event){if(event.dataevent.data.typeCHILD_SUBMIT){var devent.data.payload;showResult(childResult,来自子页面: 姓名 d.name , 邮箱 d.email);}});// ---- ② 弹框模态对话框 ---- var modaldocument.getElementById(myModal);document.getElementById(openModalBtn).addEventListener(click,function(){modal.showModal();});document.getElementById(cancelModal).addEventListener(click,function(){modal.close();});document.getElementById(modalForm).addEventListener(submit, function(e){var namedocument.getElementById(modalName).value;var notedocument.getElementById(modalNote).value;showResult(modalResult,来自弹框: 姓名 name (note ?, 备注 note:));document.getElementById(modalForm).reset();});/script/body/html

相关新闻

选择重庆报告厅专业音响调试服务,要看哪些适配条件?

选择重庆报告厅专业音响调试服务,要看哪些适配条件?

今天我就给大家分享一些专业音响调试服务的通用选型标准,不过要说明的是,我只输出选型方法,不会做具体的产品推荐。通用选型标准服务团队专业性:专业的服务团队是保障音响调试效果的关键。团队成员应具备相关的专业知识和技能&…

2026/7/19 22:20:52 阅读更多 →
推荐几个牛逼的AI Agent项目

推荐几个牛逼的AI Agent项目

1.智能代码审查AI Agent 项目描述 代码审查AI Agent(CodeGuardian AI) 是面向企业与团队的智能代码审查 Agent。 它将传统静态分析与大语言模型(LLM)深度结合,提供多语言、多维度、高上下文感知的代码问题识别与修复建议。 通过与 Git 仓…

2026/7/19 22:20:52 阅读更多 →
喷洒均匀的农业无人机怎么选?极飞X系列农业机器人给出全新答案

喷洒均匀的农业无人机怎么选?极飞X系列农业机器人给出全新答案

农户真正关心的是:喷药是不是真到叶背叶面,撒肥撒种是不是不重不漏,亩用量是不是前后一致,农忙时机器能不能持续作业,数据能不能留痕。传统认知里,“均匀”常被简化成“甩盘够不够大、料箱够不够满”&#…

2026/7/19 22:19:51 阅读更多 →

最新新闻

GUI学习——day2

GUI学习——day2

事件监听当某个事件完成时,会做什么如 按下按钮,生成aaapackage com.kuang.lesson02;import java.awt.*; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; import…

2026/7/20 11:47:42 阅读更多 →
如何快速设计三国杀武将卡牌:零基础完整制作教程

如何快速设计三国杀武将卡牌:零基础完整制作教程

如何快速设计三国杀武将卡牌:零基础完整制作教程 【免费下载链接】Lyciumaker 在线三国杀卡牌制作器 项目地址: https://gitcode.com/gh_mirrors/ly/Lyciumaker Lyciumaker是一款完全开源的在线三国杀卡牌制作器,让每个人都能轻松创建专业级的三国…

2026/7/20 11:47:42 阅读更多 →
easyExcelJs进阶:实现复杂Excel报表的完整解决方案

easyExcelJs进阶:实现复杂Excel报表的完整解决方案

easyExcelJs进阶:实现复杂Excel报表的完整解决方案 【免费下载链接】easyExcelJs 简单的操作生成漂亮的EXCEL,快速上手。提供漂亮模板直接使用 项目地址: https://gitcode.com/gh_mirrors/ea/easyExcelJs easyExcelJs是一款简单易用的JavaScript库…

2026/7/20 11:47:42 阅读更多 →
Terragrunt Atlantis Config CLI命令全解析:15个实用参数助你高效生成配置

Terragrunt Atlantis Config CLI命令全解析:15个实用参数助你高效生成配置

Terragrunt Atlantis Config CLI命令全解析:15个实用参数助你高效生成配置 【免费下载链接】terragrunt-atlantis-config Generate Atlantis config for Terragrunt projects. 项目地址: https://gitcode.com/gh_mirrors/te/terragrunt-atlantis-config Terr…

2026/7/20 11:47:42 阅读更多 →
RAGFlow: 一个完整的RAG使用解决方案

RAGFlow: 一个完整的RAG使用解决方案

概述 RAGFlow 是一款基于深度文档理解构建的开源 RAG(Retrieval-Augmented Generation)引擎。RAGFlow 可以为各种规模的企业及个人提供一套精简的 RAG 工作流程,结合大语言模型(LLM)针对用户各类不同的复杂格式数据提…

2026/7/20 11:47:42 阅读更多 →
多语言 Hreflang 标签 建站 配置 | 3步修复GSC缺少返回标签报错

多语言 Hreflang 标签 建站 配置 | 3步修复GSC缺少返回标签报错

谷歌Search Console后台的旧版工具栏目里,国际定位报告出现红色警告提示。页面上方的折线图显示缺少返回标签错误数量达到了125个。鼠标移动到图表右上角的向下箭头图标,点击导出按钮,一份包含全部异常网页明细的CSV格式文件被保存到本地电脑…

2026/7/20 11:46:42 阅读更多 →

日新闻

2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!

2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!

7月18日智东西消息,在2026 WAIC期间,努比亚联合字节豆包打造的二代“豆包手机”努比亚NaviX Ultra首次亮相,相比一代有诸多升级。智能体手机理念中兴通讯终端事业部总裁、努比亚总裁倪飞表示,智能体手机要从人操作手机变为手机帮人…

2026/7/20 0:00:34 阅读更多 →
努比亚NaviX Ultra亮相WAIC,智能体手机能否让用户生活更简单?

努比亚NaviX Ultra亮相WAIC,智能体手机能否让用户生活更简单?

努比亚NaviX Ultra:外观与功能双升级在2026 WAIC期间,首次亮相的努比亚NaviX Ultra吸引了众多目光。它是努比亚联合字节豆包打造的二代“豆包手机”,与一代努比亚M153相比,外观设计变化较大。其机身背部搭载横向排布的大尺寸影像模…

2026/7/20 0:00:34 阅读更多 →
C# 将逗号分割的字符串转换为long,并添加到List<long>

C# 将逗号分割的字符串转换为long,并添加到List<long>

目录 方法1:使用Split和Convert.ToInt64 方法2:使用LINQ的Select和ToList 方法3:使用TryParse进行异常安全转换(推荐) 如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天…

2026/7/20 0:00:34 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/20 5:57:49 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/20 4:31:26 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/20 5:56:42 阅读更多 →

月新闻