必须用 + 而非 列表,因其具备语义化、可访问性(屏幕阅读器准确播报)、SEO 权重识别及移动端滑动支持;实时搜索需用 input 事件监听、e.target.value.trim() 取值、批量 DOM 操作、XSS 安全高亮及语义化空状态处理。

直接用 浏览器对 用户粘贴、语音输入、剪贴板拖入,甚至 IME 输入法上屏时, 用户输 空状态是用户决策点,不是报错。HTML 层只需提供明确语义结构,CSS 控制样式,JS 控制显隐。 生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力:
- 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面;
- 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”;
- 提及位于 `apps/console/src/featur 最易被忽略的是匹配逻辑和空格处理:用户习惯连打空格再删, 包裹搜索结果,别用 为什么必须用
+ 而不是 有默认语义和可访问性支持: 自动被识别为“列表”, 是“列表项”,NVDA、VoiceOver 等工具能准确播报“共 X 项,当前第 Y 项”;而一堆 在 内会被视为该结果的主标题,权重高于散落在
+ 天然支持逐项停顿,ul#result-list { list-style: none; margin: 0; padding: 0; } 一行就能清掉所有浏览器差异,margin、padding、display,还容易漏掉老 IE 的缩进 bug
input 事件监听比 keyup 更可靠keyup 都不会触发,但 input 事件会。实时过滤必须用它。
searchInput.addEventListener('input', handler),不是 oninput 属性写法(不利于解绑和复用)e.target.value,别用 this.value 或 event.srcElement.value,后者在某些 polyfill 下不可靠.trim():空格开头或结尾会导致 startsWith() 匹配失败,比如搜 " react" 匹配不到 id="react-router"
input 都调用 innerHTML = '' 再拼接,超过 10 条结果就该用 document.createElement('li') 批量创建后 append()
关键词高亮必须防 XSS 和错匹配
<script>alert(1)</script> 或正则符号如 js+,直接 replace() 会崩或执行脚本。安全高亮不是加个 就完事。
keyword.replace(/[.*+?^${}()|[]\]/g, '\$&')(注意方括号里要双反斜杠)new RegExp(`\b(${escaped})\b`, 'gi'),\b 保证全词匹配,避免把 javascript 里的 js 错亮const cleanText = document.createElement('div'); cleanText.innerHTML = rawString; const plain = cleanText.textContent;,再对 plain 执行高亮textContent,摘要用 innerHTML(仅限已清洗+高亮过的字符串),绝不用 innerHTML 直接塞原始字段空状态不能只写“未找到”
,不能只是 display: none 隐藏空状态块——它会让辅助技术完全忽略;正确做法是初始渲染时就不插入,或用 aria-hidden="true" + hidden 属性配合 JS 切换id 或 alt,空状态文案要对应说明:“正在按按钮 ID 或图片描述查找”trim() 必须放在事件回调最开头;还有人以为 startsWith() 能跨属性匹配,其实它只对字符串生效,想同时查 id 和 alt 得手动拼成一个判断链,比如 (el.id || el.alt || '').toLowerCase().startsWith(query.toLowerCase())。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










