F12 控制台日志移植到页面案例
场景捕获 console 的所有输出并实时显示在页面上这在移动端调试或无法打开 DevTools 的环境中特别有用。!DOCTYPE htmlhtmllangzh-CNheadmetacharsetUTF-8metanameviewportcontentwidthdevice-width, initial-scale1.0title页面内 Console 日志查看器/titlestyle:root{--bg:#0d1117;--panel:#161b22;--border:#30363d;--text:#c9d1d9;--log:#79c0ff;--info:#58a6ff;--warn:#d29922;--error:#f85149;--debug:#8b949e;--accent:#3fb950;}*{box-sizing: border-box;}body{margin:0;font-family: -apple-system,Segoe UI,PingFang SC,Microsoft YaHei, sans-serif;background: var(--bg);color: var(--text);display: flex;flex-direction:column;height: 100vh;}/* 顶部工具区模拟触发日志的按钮 */ .toolbar{padding: 12px 16px;background: var(--panel);border-bottom: 1px solid var(--border);}.toolbar h1{font-size: 15px;margin:0010px;color:#fff;font-weight:600;}.btn-row{display: flex;flex-wrap: wrap;gap: 8px;}button{border: 1px solid var(--border);background:#21262d;color: var(--text);padding: 6px 12px;border-radius: 6px;font-size: 13px;cursor: pointer;transition: background .15s;}button:hover{background:#30363d; }button.clear{border-color: var(--error);color: var(--error);margin-left: auto;}button.clear:hover{background: rgba(248,81,73,.1);}/* 控制台面板 */ .console-panel{flex:1;display: flex;flex-direction:column;overflow: hidden;}.console-header{padding: 8px 16px;background: var(--panel);border-bottom: 1px solid var(--border);display: flex;align-items: center;gap: 12px;font-size: 12px;color: var(--debug);}.console-header .dot{width: 8px;height: 8px;border-radius:50%;background: var(--accent);display: inline-block;}.filter-tabs{display: flex;gap: 4px;margin-left: auto;}.filter-tabs button{padding: 3px 10px;font-size: 11px;}.filter-tabs button.active{background: var(--accent);color:#000;border-color: var(--accent);}.console-body{flex:1;overflow-y: auto;padding: 4px0;font-family:SFMono-Regular, Consolas,Courier New, monospace;font-size:12.5px;}.log-entry{display: flex;padding: 6px 16px;border-bottom: 1px solid rgba(48,54,61,.5);align-items: flex-start;gap: 10px;animation: fadeIn .15s ease-out;}keyframes fadeIn{from{opacity:0;transform: translateY(-4px);}to{opacity:1;transform: translateY(0);}}.log-entry:hover{background: rgba(110,118,129,.08);}.log-icon{flex-shrink:0;width: 16px;text-align: center;}.log-time{flex-shrink:0;color: var(--debug);}.log-content{flex:1;white-space: pre-wrap;word-break: break-all;}.log-count{flex-shrink:0;background:#30363d;color:#fff;border-radius: 8px;padding:07px;font-size: 11px;min-width: 18px;text-align: center;}.log-entry.log .log-content{color: var(--log);}.log-entry.info .log-content{color: var(--text);}.log-entry.warn{background: rgba(210,153,34,.08);}.log-entry.warn .log-content{color: var(--warn);}.log-entry.error{background: rgba(248,81,73,.08);}.log-entry.error .log-content{color: var(--error);}.log-entry.debug .log-content{color: var(--debug);}.empty-tip{text-align: center;color: var(--debug);padding: 40px 20px;font-size: 13px;}/* 滚动条美化 */ .console-body::-webkit-scrollbar{width: 8px;}.console-body::-webkit-scrollbar-thumb{background: var(--border);border-radius: 4px;}/style/headbodydivclasstoolbarh1 页面内 Console 演示无需打开 F12/h1divclassbtn-rowbuttononclickconsole.log(这是一条普通日志, {user: Tom, id: 1})console.log/buttonbuttononclickconsole.info(这是一条信息提示)console.info/buttonbuttononclickconsole.warn(这是一条警告内存占用较高)console.warn/buttonbuttononclickconsole.error(这是一条错误请求 /api/data 失败 (500))console.error/buttonbuttononclickconsole.debug(调试信息当前状态 , {step: 3})console.debug/buttonbuttononclicktriggerRealError()触发运行时错误/buttonbuttononclicktriggerPromiseError()触发 Promise 异常/buttonbuttonclassclearonclickclearLogs()清空日志/button/div/divdivclassconsole-paneldivclassconsole-headerspanclassdot/spanspan实时捕获中 · 共bidtotalCount0/b条/spandivclassfilter-tabsbuttonclassactive>allonclicksetFilter(all, this)全部/buttonbutton>logonclicksetFilter(log, this)Log/buttonbutton>infoonclicksetFilter(info, this)Info/buttonbutton>warnonclicksetFilter(warn, this)Warn/buttonbutton>erroronclicksetFilter(error, this)Error/button/div/divdivclassconsole-bodyidconsoleBodydivclassempty-tipidemptyTip暂无日志点击上方按钮试试或在真实代码里调用 console.xxx()/div/div/divscript(function(){const consoleBodydocument.getElementById(consoleBody);const emptyTipdocument.getElementById(emptyTip);const totalCountEldocument.getElementById(totalCount);letcurrentFilterall;lettotalCount0;// 保留原始方法方便同时输出到真实控制台 const original{log: console.log.bind(console), info: console.info.bind(console), warn: console.warn.bind(console), error: console.error.bind(console), debug: console.debug.bind(console),};const icons{log:▶, info:ℹ, warn:⚠, error:✖, debug:●};// 把任意参数格式化成字符串对象/数组转 JSONError 显示堆栈functionformatArg(arg){if(arg instanceof Error){returnarg.stack||(arg.name : arg.message);}if(typeof argobjectarg!null){try{returnJSON.stringify(arg, null,2);}catch(e){returnString(arg);}}returnString(arg);}functiongetTime(){const dnew Date();const padnString(n).padStart(2,0);return${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}.${String(d.getMilliseconds()).padStart(3,0)};}functionrenderLog(type, args){totalCount;totalCountEl.textContenttotalCount;emptyTip.style.displaynone;const textargs.map(formatArg).join( );// 合并相邻的重复日志类似真实控制台的折叠计数 const lastEntryconsoleBody.lastElementChild;if(lastEntrylastEntry.dataset.typetypelastEntry.dataset.texttext){const countEllastEntry.querySelector(.log-count);const nparseInt(countEl.dataset.n||1,10)1;countEl.dataset.nn;countEl.textContentn;countEl.style.displayinline-block;return;}const entrydocument.createElement(div);entry.classNamelog-entry ${type};entry.dataset.typetype;entry.dataset.texttext;entry.style.display(currentFilterall||currentFiltertype)?flex:none;entry.innerHTMLspanclasslog-icon${icons[type]||▶}/spanspanclasslog-time${getTime()}/spanspanclasslog-content/spanspanclasslog-count>1styledisplay:none1/span;entry.querySelector(.log-content).textContenttext;consoleBody.appendChild(entry);consoleBody.scrollTopconsoleBody.scrollHeight;}// 重写 console 各方法[log,info,warn,error,debug].forEach(type{console[type]function(...args){original[type](...args);// 仍然输出到真实 F12 控制台 renderLog(type, args);// 同时渲染到页面};});// 捕获未被 try/catch 的运行时错误 window.addEventListener(error,function(e){renderLog(error,[未捕获异常: ${e.message}(${e.filename}:${e.lineno}:${e.colno})]);});// 捕获未处理的 Promise rejection window.addEventListener(unhandledrejection,function(e){renderLog(error,[未处理的 Promise 异常: ${formatArg(e.reason)}]);});// 过滤器 window.setFilterfunction(filter, btn){currentFilterfilter;document.querySelectorAll(.filter-tabs button).forEach(bb.classList.remove(active));btn.classList.add(active);document.querySelectorAll(.log-entry).forEach(el{el.style.display(filterall||el.dataset.typefilter)?flex:none;});};window.clearLogsfunction(){consoleBody.innerHTML;consoleBody.appendChild(emptyTip);emptyTip.style.displayblock;totalCount0;totalCountEl.textContent0;};window.triggerRealErrorfunction(){// 故意调用一个不存在的函数产生真实的运行时错误 nonExistentFunction();};window.triggerPromiseErrorfunction(){Promise.reject(new Error(模拟的异步请求失败));};// 页面加载时打一条欢迎日志验证功能生效 console.log(✅ Console 已接管日志将同时显示在页面与 F12 中);})();/script/body/html

相关新闻

应用AR远程指导,推动企业高效协作新模式

应用AR远程指导,推动企业高效协作新模式

在数字化浪潮席卷全球的今天,企业间的竞争早已从单纯的产品比拼转向效率与创新的较量。为了在激烈的市场环境中保持竞争优势,越来越多的企业选择借助新兴技术实现转型。其中,AR技术凭借其沉浸式、可视化和交互性强的特点,正成为企…

2026/7/9 5:25:05阅读更多 →
Burp Suite Repeater模块深度解析:从基础操作到SQL注入实战

Burp Suite Repeater模块深度解析:从基础操作到SQL注入实战

1. 项目概述:为什么“重发请求”是渗透测试的核心技能?如果你刚开始接触Burp Suite,可能会觉得它功能繁杂,无从下手。但当你真正上手后,会发现,“重发请求”这个看似简单的操作,其实是贯穿整个W…

2026/7/9 5:25:05阅读更多 →
系统集成项目工程师备考复盘

系统集成项目工程师备考复盘

备考系统集成项目管理工程师这段时间,整理了一套完整复习素材,包含教材重点笔记、历年真题、案例答题模板、计算题速记手册,适配零基础短周期冲刺。 之前备考踩了不少弯路,零散资料翻找效率很低,索性整合归档一份完整包…

2026/7/9 5:20:05阅读更多 →
WarcraftHelper:魔兽争霸III现代优化插件完整指南

WarcraftHelper:魔兽争霸III现代优化插件完整指南

WarcraftHelper:魔兽争霸III现代优化插件完整指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典魔兽争霸III在现代电脑上的兼…

2026/7/9 6:30:09阅读更多 →
Android 13 OTA 增量包制作实战:从源码到升级包的 5 步构建流程

Android 13 OTA 增量包制作实战:从源码到升级包的 5 步构建流程

Android 13 OTA 增量包制作实战:从源码到升级包的 5 步构建流程当你的设备收到一个几百MB的系统更新包时,是否好奇过这个精简的增量包是如何从庞大的AOSP源码生成的?作为ROM开发者或系统工程师,掌握OTA增量包的制作技术不仅能优化…

2026/7/9 6:30:09阅读更多 →
终极AMD Ryzen性能调优指南:SMU调试工具深度掌控

终极AMD Ryzen性能调优指南:SMU调试工具深度掌控

终极AMD Ryzen性能调优指南:SMU调试工具深度掌控 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitcode…

2026/7/9 6:30:09阅读更多 →
MT25QL128ABA FLASH 驱动实战:Verilog 实现 SPI 模式 0 读写,时序仿真 100% 通过

MT25QL128ABA FLASH 驱动实战:Verilog 实现 SPI 模式 0 读写,时序仿真 100% 通过

MT25QL128ABA FLASH 驱动实战:Verilog 实现 SPI 模式 0 读写与全流程验证 1. 工程架构设计 MT25QL128ABA 是一款 128Mb 容量的 NOR Flash 存储器,采用标准 SPI 接口通信。在 FPGA 开发中,我们需要设计一个完整的 SPI Master 控制器来实现对其…

2026/7/9 6:30:09阅读更多 →
别再盲目调用API了!o1与R1的token计费陷阱、缓存命中率与冷启动延迟(附可运行的监控脚本与阈值告警配置)

别再盲目调用API了!o1与R1的token计费陷阱、缓存命中率与冷启动延迟(附可运行的监控脚本与阈值告警配置)

更多请点击: https://codechina.net 第一章:别再盲目调用API了!o1与R1的token计费陷阱、缓存命中率与冷启动延迟(附可运行的监控脚本与阈值告警配置) 盲目调用大模型API正悄然侵蚀团队预算与用户体验——o1模型按输入…

2026/7/9 6:30:09阅读更多 →
Claude Code刚发布的Context-Aware Debugging模式,让Cursor的“智能跳转”瞬间过时?一线全栈工程师连夜重写CI/CD流水线后的真相

Claude Code刚发布的Context-Aware Debugging模式,让Cursor的“智能跳转”瞬间过时?一线全栈工程师连夜重写CI/CD流水线后的真相

更多请点击: https://codechina.net 第一章:Claude Code Context-Aware Debugging的底层架构革命 Claude Code的Context-Aware Debugging并非传统IDE插件的简单增强,而是基于多模态上下文建模与实时语义索引构建的全新调试范式。其核心突破在…

2026/7/9 6:25:09阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/9 5:56:19阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/8 7:00:12阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/9 2:47:07阅读更多 →
Three.js 着色器光效教程

Three.js 着色器光效教程

着色器光效 Shader Light ▶ 在线运行案例 案例合集: 三维可视化功能案例(threehub.cn)开源仓库github地址: https://github.com/z2586300277/three-cesium-examples400个案例代码: 网盘链接 你将学到什么 ShaderMaterial 自…

2026/7/9 0:04:37阅读更多 →
如何5分钟掌握CS2智能库存管理:开源工具CASEMOVE终极指南

如何5分钟掌握CS2智能库存管理:开源工具CASEMOVE终极指南

如何5分钟掌握CS2智能库存管理:开源工具CASEMOVE终极指南 【免费下载链接】casemove A dedicated desktop app that enables you to move items in and out of storage units in CS2. 项目地址: https://gitcode.com/gh_mirrors/ca/casemove 还在为CS2存储单…

2026/7/9 0:04:37阅读更多 →
GBase 8a vs MySQL 8.0:ALTER TABLE语法与限制的5点关键差异对比

GBase 8a vs MySQL 8.0:ALTER TABLE语法与限制的5点关键差异对比

GBase 8a与MySQL 8.0:ALTER TABLE语法差异深度解析与实战指南1. 两种数据库的ALTER TABLE能力全景对比在数据库架构设计和运维过程中,表结构变更(DDL操作)是不可避免的需求。GBase 8a作为国产分析型数据库代表,与开源M…

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

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

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

2026/7/8 6:59:54阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

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

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

2026/7/8 13:42:39阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

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

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

2026/7/8 13:42:39阅读更多 →