表单反馈信息需在正确时机、方式和位置响应,应紧邻对应控件放置于label后或同级span中,同步控制display:none与aria-hidden="true"/tabindex="-1",动态字段需实时联动required状态并服务端兜底校验。

表单反馈信息不是“显示出来就行”,关键在于它是否在正确时机、以正确方式、对正确字段给出响应。硬塞一个 alert() 或直接 innerHTML 替换,八成会破坏可访问性、绕过校验逻辑、或让屏幕阅读器完全失语。
feedback 容器该放哪儿才不影响表单语义结构
反馈信息必须紧邻对应表单控件,不能堆在表单底部或用绝对定位甩到角落。否则:aria-live 区域失效、label 关联断裂、键盘 Tab 顺序错乱。
- 推荐放在
<label></label>后面或<input>同级的<span class="form-feedback"></span>中,保持 DOM 邻近性 - 避免包裹在
<div> 里再用 <code>position: absolute覆盖——它脱离文档流,screen reader无法感知上下文 - 如果用
<fieldset></fieldset>分组,反馈应放在<legend></legend>下方或该<fieldset></fieldset>内部末尾,维持逻辑层级 - 显示反馈时:移除
display: none,同时设aria-hidden="false"(或直接删该属性),确保可访问性 API 正确识别 - 隐藏反馈时:加
display: none,**且必须同步**加aria-hidden="true"和tabindex="-1" - 别用
visibility: hidden—— 它占布局空间,且焦点仍能进入,违反 WCAG 2.1 2.4.3(Focus Order) - 显示字段时:手动调用
element.required = true,并触发element.reportValidity()(可选,仅需即时提示) - 隐藏字段时:设
element.required = false,并清空其value和setCustomValidity(''),避免残留错误态 - 监听用
change而非click:对input[type="checkbox"]和select,change才代表值真正变更,click时checked还是旧值
display: none 和 aria-hidden="true" 必须同步开关
只设 display: none 是危险的:隐藏的反馈仍可能被屏幕阅读器读出(尤其当它没加 aria-hidden),或者被键盘焦点意外抵达(如果没设 tabindex="-1")。
把任意文章或文档内容转换成精美的全屏翻页 HTML 演示文件(幻灯片风格)。当用户发来一篇文章、文档链接、Markdown 内容、或粘贴的文本,并且希望生成演示用的 HTML 时触发。支持任意内容来源:iWiki 链接、KM 链接、本地文件路径、直接粘贴的文本。生成的 HTML 文件保存到本地工作区,并通过企微直接发送给用户。触发词示例:帮我把这篇文章做成PPT、转成演示文档、生成HTML幻灯片、做个演示、转成可以演示的格式、article to deck、make a slide。
动态显示 feedback 时,required 和 validity 状态要实时联动
用户勾选“其他”后弹出文本框,这个新字段若设了 required,但 JS 只控制显隐不碰校验状态,提交时浏览器会静默忽略它——因为 checkValidity() 不会主动扫描刚显示的元素。
立即学习“前端免费学习笔记(深入)”;
最常被跳过的一步:所有前端动态逻辑都得有服务端兜底。哪怕 JS 把 feedback 显示得再精准,只要后端没校验“发票税号是否在‘开具发票’为 true 时必填”,就等于没校验。


















