G4.04.1new window breaks the back chain设计研究

新窗口打断返回链

别名: 新窗口打断返回 · target blank · 返回链断裂 · tab breaks history

概念解释

在当前页点一个链接,若它在新窗口或新标签打开,原来那一页的 history stack 不会长出这一跳。新上下文从一张几乎空白的栈开始。人按返回,动作落在新窗口里——常常无上一页可弹,或弹出的是无关的站点——而原窗口还停在出发页。新窗口打断返回链:时间性撤销被切成两截,每一截都不含对方。

机制

浏览器把历史记在浏览上下文上,不是记在「用户以为的这一次点击流」上。target="_blank"window.open 创建一个新上下文,前进被写进新栈,出发页的栈原地不动。用户的心智模型是一条链:点进去,看完,返回。链在实现里分叉了。新标签若被弹到屏幕外或在移动端被叠在下面,人甚至看不见分叉,只看见「返回没用」或「原来的表单还在,但我回不去刚才看的那一页」。

移动 Safari 和多数 App 内 WebView 对多窗口的可见性更差,打断更像丢失。读屏用户的虚拟光标停在原文档,新窗口的内容要另一次焦点迁移才能到达;返回手势却可能关掉新上下文,光标找不到刚才的阅读位置。Nielsen 早期反对随意开新窗口,依据就是这条链被产品单方面剪断,而用户还在按那套撤销模型操作。

怎么研究

让人从一篇正在读的文档点开引用,比较原地打开与新标签打开,任务是「看完引用,回到刚才读到的段落」。

  • 自变量:打开方式(当前上下文 / 新标签 / 被系统后台化的新窗口)、设备(桌面多标签可见 vs 手机)。
  • 因变量:是否用 Back 成功回到出发段、是否找错窗口、完成时间、把「返回没反应」描述成系统坏了的次数。
  • 方法论注意点:实验室显示器够大时,两个标签并排,打断被视觉补偿,会低估伤害。手机或把新标签开到另一个桌面,才暴露链断。不要把「用户会不会关错窗口」和「链断了」混成一个分数——关错是窗口管理,链断是历史模型。

边界

用户自己用中键、长按「在新标签打开」,是故意分叉,链断是他们选的,产品不应再改写成原地。下载、打印预览、OAuth 弹窗这类本来就不是「下一页」的上下文,返回链本来就不该把它们编进去。单页应用内部用路由假装新窗口(其实还在同一 history),链没有断,这条不成立——那是假的新窗口。

怎么落地

  • 默认在当前浏览上下文打开站内下一页,让 Back 能弹出这一跳。
  • 统计产品里所有 target="_blank",每一处问「打断这条返回链的收益是什么」;答不上来的改回原地。
  • 必须新开时,原页不要卸载用户的位置;新上下文里若 history.length 为 1,不要画一个会调用 back() 的按钮。
  • 验证:从文章中部点引用,看完后只允许用系统返回。原地打开应回到中部;新标签打开应无法用返回回到那一段。后一种若被当成默认,返回链已被打断。再在手机上重做一遍,确认不是靠桌面标签栏才找得回来。

延伸

  • 同组G4.04.2 离开当前流程的链接才考虑新窗口 · G4.04.3 新窗口需提前告知
  • 相邻G4.01 返回栈与返回语义 · G4.08 外部链接与离开提示 · G2.07 导航的一致性
  • 站内检索target=_blank · history stack · new window

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/G4.04.1