子页面和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:50阅读更多 →
推荐几个牛逼的AI Agent项目

推荐几个牛逼的AI Agent项目

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

2026/7/19 22:20:50阅读更多 →
函数加数组实践——排雷

函数加数组实践——排雷

一.实现排雷分为四个步骤1.初始化棋盘分为一个mine数组,一个show数组;用show输出打印游戏雷的数组,用mine来排雷。其中ROWS为行数,COLS为列数;char mine[ROWS][COLS];//存放的是雷的信息 char show[ROWS][COLS];//存放…

2026/7/19 22:18:49阅读更多 →
突破性解决方案:tchMaterial-parser让教育资源获取效率提升300%

突破性解决方案:tchMaterial-parser让教育资源获取效率提升300%

突破性解决方案:tchMaterial-parser让教育资源获取效率提升300% 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地获取课本内容。 …

2026/7/20 12:54:19阅读更多 →
ADT数据泄露实战复盘:安防企业第三方风控、数据防护与应急SOP全教程

ADT数据泄露实战复盘:安防企业第三方风控、数据防护与应急SOP全教程

1 事件全景还原:千万级安防用户数据泄露完整经过 2026年4月,北美头部安防服务商ADT突发大规模定向数据窃取攻击,知名黑产勒索组织ShinyHunters在暗网多个数据交易社区公开公示攻击成果,宣称完整拿下1000万条ADT存量客户原始数据&a…

2026/7/20 12:54:19阅读更多 →
GitHub假仓库BoryptGrab木马:攻防拆解+溯源排查+防御加固实战教程

GitHub假仓库BoryptGrab木马:攻防拆解+溯源排查+防御加固实战教程

2026年6月底,网络安全厂商Arctic Wolf对外披露了一起影响范围极广的开源供应链大规模投毒事件,瞬间引爆开发者安全社区。一支长期活跃在黑灰产领域、专注窃取开发者与加密货币用户高价值资产的未知威胁团伙,针对GitHub生态完成了一次流水线式…

2026/7/20 12:54:19阅读更多 →
大客户销售复盘系统:从丢单里抢回你本可以赢的生意

大客户销售复盘系统:从丢单里抢回你本可以赢的生意

别再用“对手价格更低”打发自己,体系力帮你把客户拒绝变成增长杠杆复盘不是为了写报告交差。真正有用的复盘系统,能让你看清每个大客户决策背后的真实阻力,并把经验固化到下一次作战动作里。大客户销售中,最贵的成本不是人力或差…

2026/7/20 12:54:19阅读更多 →
Eva.js跨平台游戏开发实战:从Web到小程序的完整指南

Eva.js跨平台游戏开发实战:从Web到小程序的完整指南

1. 项目概述:为什么选择Eva.js进行跨平台游戏开发? 如果你正在开发一款轻量级的2D游戏,并且希望它能同时跑在网页、微信小程序、甚至更多平台上,那么你很可能已经对“一次编写,多端部署”这个目标感到既向往又头疼。传…

2026/7/20 12:54:19阅读更多 →
TI PRU-ICSS UART与MII_RT模块深度解析与实战指南

TI PRU-ICSS UART与MII_RT模块深度解析与实战指南

1. 项目概述与核心价值 在工业自动化、电机驱动和网络化控制系统中,嵌入式处理器不仅要完成复杂的算法运算,还必须具备与外部世界进行可靠、实时数据交换的能力。通用异步收发传输器(UART)作为最经典、最普遍的串行通信接口&#…

2026/7/20 12:52:18阅读更多 →
Go语言静态资源打包方案对比与实践指南

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

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

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

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

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

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

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

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

2026/7/20 0:50:54阅读更多 →
2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!

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

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

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

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

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

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

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

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

2026/7/20 0:01:04阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/19 22:50:49阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/19 14:50:26阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/19 18:50:36阅读更多 →