E4.18.2find-in-page vs virtualized rows设计研究

页面内查找在虚拟滚动下可能失效

别名: 虚拟列表查找 · 查找找不到 · 未渲染行 · virtual find

概念解释

系统的「页内查找」在已经画出来的文本上匹配。虚拟列表把窗口外的行卸掉,那些行的文字不在文档里,查找就会报没有,即使数据里明明有。这是窗口与查找的裂缝(find versus windowed rows):用户以为在搜整份列表,系统只在搜当前这一屏。它和折叠块藏内容不同——折叠至少还把节点留在树上;虚拟化是节点根本没被创建。

机制

查找的实现默认「可见页面的文本 ≈ 文档树的文本」。虚拟化故意打破这个近似:为了性能,树只覆盖窗口。匹配因此被窗口裁切,远端命中不会进入计数,也不会被滚到。应用若提供自己的搜索框却仍只扫可见节点,会复制同一裂缝,只是换了入口。要补上,查找必须走数据层:在完整数组里匹配,再把窗口跳到那一行并创建节点,高亮才有附着点。不跳窗口只报「找到了」,用户仍然看不见。计数也必须以数据层为准,否则「1 / 1」其实是「这一屏的 1 / 1」。

怎么研究

在长虚拟列表里埋一个只出现在远端行的词,用系统查找和应用内查找分别去定位。自变量:查找是否查询数据层、命中后是否跳窗口。因变量:报告找到、实际看见高亮、错误的「无结果」。系统查找在未打补丁的虚拟列表上应系统性漏报远端词。

边界

应用禁止系统查找、只提供自己的、且明确写着搜全部数据,裂缝可以补上。打印和导出若走数据层,不受窗口限制,但那不是查找。辅助技术的「在页面中查找」同样只看见树里的节点,需要同一条数据层通道,并在跳转后把焦点放到新创建的行上。短窗口缓冲不会拯救查找——缓冲仍远小于全集。

怎么落地

  • 为虚拟列表提供走数据层的查找,命中后滚动窗口并渲染该行再高亮。
  • 不要让系统查找在未补丁的虚拟列表上充当「搜全部」;做不到就在无结果时说明只搜了可见行。
  • 命中计数按全集,不要按窗口。
  • 验证:搜一个只在第 N 屏出现的词。必须看见该行高亮。只报找到或报无结果,裂缝就还在。

延伸

  • 同组E4.18.1 虚拟滚动只渲染可见区域以维持长列表的性能 · E4.18.3 滚动条位置与实际数据量的映射需保持准确 · E4.18.4 快速滚动时占位内容闪烁会影响可读性
  • 相邻E4.07 折叠面板 · E2.10 搜索输入框
  • 站内检索find in page · virtualized search · unmounted nodes

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/E4.18.2