/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}
1. 一个让人抓狂的跳转异常:about:blank#blocked 到底是什么
如果你写过前端页面,尤其是做过营销落地页、后台管理系统里的外链跳转,大概率遇到过这个场景:代码里明明写的是 <a href=\”https://example.com\” target=\”_blank\”>点击查看</a> ,用户点下去,浏览器确实弹出了新标签页,但地址栏里赫然写着 about:blank#blocked ,页面一片空白,什么内容都没有。用户以为链接坏了,你打开控制台翻来覆去地看,代码没写错,网络请求也没报错,就是跳不过去。
这个现象在业内通常被称为“新标签页被拦截”或“空白页拦截”,核心关键词就是 a标签 、 超链接 、 about:blank#blocked 、 target=_blank 。它不是一个浏览器 Bug,而是浏览器安全策略、页面上下文、链接属性三者共同作用的结果。换句话说,浏览器是“故意”这么干的,只是它没有给你一个友好的提示。
这篇文章面向的是所有需要处理页面跳转的前端开发者、运营页搭建人员、后台系统维护者,以及经常和富文本编辑器、CMS 模板打交道的人。我会把 about:blank#blocked 的成因拆开讲清楚,给出可直接复现的排查步骤和修复方案,并且补充一些在实际项目里踩过的坑。不管你是刚入行的新手,还是写了几年页面但一直没搞明白这个问题的老手,看完都能直接拿去用。
需要先明确一点: about:blank#blocked 里的 about:blank 是浏览器的一个内部空白页地址, #blocked 是浏览器附加的标记,表示这次导航被阻止了。它和 404、502 这类服务器错误完全不是一回事,服务器可能压根没收到请求。所以排查方向要从“浏览器为什么阻止”入手,而不是去查后端日志。
2. 浏览器为什么要拦截这次跳转:核心机制拆解
2.1 target=_blank 的默认行为与安全演进
早期浏览器里, target=\”_blank\” 就是单纯地“开个新窗口”。但后来安全研究者发现,新打开的页面可以通过 window.opener 拿到原页面的引用,进而把原页面导航到钓鱼站点,这就是著名的“反向标签劫持”。于是现代浏览器陆续给 target=\”_blank\” 加上了隐式的 rel=\”noopener\” 行为,Chrome 从 88 版本开始默认启用。
这个安全策略本身是好事,但它带来一个副作用:当新页面的打开依赖于某些“用户手势”或“同源上下文”时,浏览器会变得更谨慎。如果你的链接写法触发了浏览器的拦截规则,它就会用 about:blank#blocked 来告诉你“这次导航我不放行”。
2.2 触发拦截的几类典型场景
我把实际项目中遇到过的触发条件整理成下面这张表,方便你对照排查:
| 链接在 iframe 内且跨域 | 点击后新标签空白 | 跨域 iframe 的导航权限受限 |
| href 为空或为 # | 新标签显示 about:blank#blocked | 没有有效目标地址,浏览器拒绝导航 |
| href 为 javascript:void(0) | 新标签空白 | 伪协议无法作为新页面地址 |
| 链接被 JS 动态改写 | 偶发空白 | 改写时机晚于浏览器安全校验 |
| 页面处于沙箱环境 | 全部外链失效 | sandbox 属性未授予 allow-popups |
| 浏览器扩展拦截 | 特定域名空白 | 广告拦截或安全插件介入 |
这张表里,前三种是代码写法问题,中间两种是运行环境问题,最后一种是外部干扰。排查时要按“先看代码、再看环境、最后看插件”的顺序来,否则容易在错误的方向上浪费时间。
2.3 为什么是 about:blank 而不是报错页
很多人疑惑:既然拦截了,为什么不直接显示一个错误提示?这是因为浏览器在决定“打开新标签”和“导航到目标地址”之间有一个时间差。新标签先被创建出来,此时它的地址就是 about:blank ,然后浏览器尝试把目标 URL 加载进去。如果加载被安全策略





