数字输入不符合 min、max、step 时,浏览器会报什么错?
数字框的原生校验并不只有一个“输入错误”。还能把低于下限、高于上限和不符合步进分别对应到 rangeUnderflow、rangeOverflow、stepMismatch,并说明提交时何时显示提示、怎样读 validity 与处理空值。
程序员面试题库第 40 页,收录第 1951–2000 题,共 5000 道完整解析,覆盖前端、JavaScript、React、Vue、Node.js、AI Agent、网络、数据库与系统设计。
按稳定语义路径排序
数字框的原生校验并不只有一个“输入错误”。还能把低于下限、高于上限和不符合步进分别对应到 rangeUnderflow、rangeOverflow、stepMismatch,并说明提交时何时显示提示、怎样读 validity 与处理空值。
下拉框中的选项组可以用 disabled 暂时关闭整组候选。组内选项不能由用户正常选择,但已有选择、脚本赋值与服务端权限校验仍需要单独处理。 它适合展示暂不可用的套餐,但不能作为业务权限控制;如果原本已选中某项,还要检查实际提交行为。
滑块选价、数量乘单价等即时计算结果可以用 output 表达。for 能把计算结果与输入关联,展示的金额却不能当作可信订单价格,也不会自动替代要提交的输入值。 计算展示与表单提交是两套机制,服务器仍须按可信单价重新计算总额。
手机号或邀请码输入框可用 pattern 做原生格式约束,再用 title 解释用户应怎样填写。正则要匹配整个值;空值是否无效取决于 required,格式错误可由 patternMismatch 判断,title 不能充当唯一提示。
CSS 的 :placeholder-shown 可在占位文字正在显示时给输入框样式,但它不是通用的空值或校验状态判断。再比较与 :not(:placeholder-shown) 的用法,并说明 placeholder、输入类型和空格值等因素如何影响命中。
一组单选框共享 name 才能互斥,提交时也以这个名字传选中项的值。通过配送方式示例说明 checked 初始状态、多个 checked 的解析结果、required 的组级校验,以及为什么同页不同问题不能复用一个 name。
滑块并不等于另一种数字输入框。range 始终有区间内的值,初始值通常是中点;精确数字输入、留空等需求则更适合 number 或文本控件。 还要给当前数值提供可见说明,让键盘与辅助技术用户知道滑块停在哪里。
看起来都不能编辑的字段,提交与交互行为可能完全不同。再比较 readonly 的可聚焦和可提交、disabled 的不可交互与不提交,并说明哪些输入类型、textarea、select 适用哪种属性,以及必填校验如何受影响。
想用脚本触发与用户点击提交按钮相同的流程,应调用 requestSubmit()。它先运行约束校验,成功后才触发 submit 事件;旧的 submit() 绕过两者。传入按钮还会影响提交数据和覆盖属性。
必填并不总是“字符串不能为空”。再比较文本输入、单选组、复选框与下拉框的 valueMissing 条件,说明单选的组级约束、复选框逐项约束、默认选项问题,以及禁用与只读状态为何不能照搬普通必填逻辑。
多选 select 的 value 只返回首个选中 option 的值;要取全部应遍历 selectedOptions,提交到表单时则以同一个 name 发送多个值。FormData.get 也只拿到一项,getAll 才能得到完整数组;没有选中项时还要处理空结果。
select 的 size 控制可见选项行数,multiple 才决定能否同时选择多个值。再比较默认下拉框与列表框的呈现,说明单选列表可以显示多行却仍只选一项,以及多选时如何用键盘操作和读取数据。
自然的 DOM 顺序通常就是最容易理解的键盘焦点顺序。正数 tabindex 会把元素提前,动态表单因此难维护;脚本可聚焦与日常 Tab 顺序又是两件事。 错误提示可以用 -1 让脚本聚焦,但不应因此插入普通键盘导航链。
搜索字段和普通文本框都能接收字符串,但 search 给浏览器提供了搜索语义,可能出现清除按钮或特定键盘提示。两者共享基础文本能力,原生清除按钮和键盘外观却不能写死;搜索动作仍需表单提交或脚本处理。
时间输入的 step 以秒为单位,60 表示一分钟一档,900 表示十五分钟一档。步进基准决定合法时刻,偏离时会出现 stepMismatch;原生选择器显示的分钟选项不一定覆盖全部输入路径。
type="url" 的输入框会按 URL 语法做基础校验,省略协议的地址通常不能通过;空值是否允许还取决于 required。validity.typeMismatch 能识别格式错误,pattern 可再收紧业务格式,但这些浏览器检查不能代替服务端验证。
表单业务规则超出 required、pattern 等原生约束时,可用 setCustomValidity 写自定义错误消息。非空错误消息会让控件持续无效,用户改对后必须清空;input 事件与 reportValidity() 可配合反馈。
周输入控件使用 ISO 周编号而不是普通日期字符串。ISO 周以周一开始,第一周和跨年归属有明确规则,有些年份还有第 53 周;格式正确也不等于业务日期范围正确。
缩写首次出现时应让读者明白它代表什么。<abbr> 的 title 能提供展开词,却不保证每位用户都方便获得;正文首次写全称、后续再用缩写更易读。 触屏用户尤其难以获得悬浮提示,重要术语的全称应直接出现在可见正文里。
accesskey 看似能提供键盘捷径,却可能和浏览器、系统、读屏软件的快捷键冲突,也受键盘布局与组合键差异影响。组合键随平台变化,还可能撞上浏览器或读屏软件快捷键;即使用它,也需要可发现的说明和可替代操作。
ARIA role 能告诉辅助技术元素扮演的角色,却不会自动补齐原生按钮的焦点、回车与空格交互。再比较 button 和 div role=button,说明原生语义优先的原因,以及何时才需要自己实现复杂控件。
article 适合能独立分发或复用的完整内容,section 用来按主题划分文档或功能区域。以博客列表与文章正文为例说明二者可以嵌套、标题如何帮助识别分区,以及为什么不能只为加样式滥用语义元素。
放在 audio 开始与结束标签之间的普通文本是给不认识 audio 元素的旧浏览器看的回退内容。现代浏览器识别了元素却无法加载音频时,不会自动显示标签内部文字;下载链接和文字稿应有独立入口。
同一段媒体可以给浏览器提供多个格式来源。浏览器通常按顺序挑能处理的候选格式;字幕、下载链接和加载失败提示仍要分别提供。 多个 source 只解决媒体格式候选,不能把不同片段当成播放列表,也不能代替文字稿。
引用内容和作品名称经常被混用成一个 cite 标签。还要区分 blockquote 表示独立成段的长引文、q 表示句内引文、cite 表示作品标题,并解释 blockquote 的 cite 属性只记录来源 URL,不会自动生成可见署名。
参数页、排序页或追踪链接展示相同内容时,head 中的 rel="canonical" 可以提示搜索引擎首选地址。它是规范化信号而非强制跳转;与重定向和站点地图的职责不同,指向错误 URL 反而可能让页面难以被正确收录。
自定义元素名称必须以 ASCII 小写字母开头,包含连字符,不含 ASCII 大写字母,也不能落入保留名称列表。连字符让浏览器与原生标签区分;注册时命名不合法与同名重复注册是不同的失败情况。
data-* 适合在元素上存放少量与脚本或样式相关的自定义数据,dataset 会把连字符属性名映射为驼峰键,读写值都按字符串处理。它不能代替可见文案、ARIA 名称或表单提交字段,更不适合保存敏感数据。
input 通过 list 引用 datalist 中的 option 后,浏览器会提供输入建议,但用户仍可提交列表之外的合法值。城市搜索等开放输入适合它;若选项必须受控,应使用 select 或额外校验,还要留意浏览器和辅助技术的呈现差异。
现代 HTML 页面应以 <!doctype html> 开头,它让浏览器进入标准模式。省略或使用某些旧式声明可能触发怪异模式,浏览器会为了兼容老网页采用不同的布局规则。它不是给页面“开启 HTML5 标签”的开关,也不是告诉浏览器用哪种字符编码;实际模式可以从 document.compatMode 检查。
在 <head> 中用 <link rel="icon"> 声明站点图标,type 描述资源的 MIME 类型,sizes 描述位图的固有像素尺寸。可以提供常用的 SVG 与 PNG 候选,让浏览器按自身支持和显示场景选择;不必为了所有可能设备枚举一大串尺寸。
<figure> 表示可作为一个整体引用的自包含内容,<figcaption> 给这个整体提供标题或说明。它常用于图片、代码示例、图表等,说明文字可放在内容前或后。普通装饰图片旁的一句正文不必硬套 figure;关键是图与说明能否作为一个单元被引用或移动,而不破坏正文理解。
<head> 放的是文档元数据和资源声明,不是页面可见正文。常见基础项包括字符编码、页面标题、视口声明、描述以及样式和图标链接。<meta charset="UTF-8"> 帮助浏览器正确解码文档;移动端 viewport meta 建立合适的布局视口。
标题元素表达内容层级,不是用来挑字体大小的标签。页面主标题通常用 h1,其下章节用 h2,再往下用 h3;层级应跟随内容从属关系。辅助技术可按标题快速浏览文档,清晰的标题也帮助搜索系统理解结构。
普通 hidden 状态表示元素当前不应呈现,浏览器通常用用户代理样式把它设成 display: none。作者 CSS 如果给它写了会覆盖该规则的 display,元素仍可能被画出来。
给 <iframe> 加空的 sandbox,浏览器会对嵌入页面施加一组限制,例如脚本、表单提交、顶层导航及同源能力受限。按真实需求加 allow-scripts、allow-forms 等令牌逐项放行。
图片只负责装饰、旁边文字已完整传达同一信息时,可写 alt="",让辅助技术跳过这张无额外信息的图。图片承担内容、操作或链接含义时,应写简洁而具体的替代文本。空 alt 与省略 alt 不一样;省略时,辅助技术可能读出文件名或其他不理想的信息。
alt 是图片内容或功能的文本替代,在图片无法显示及辅助技术读取时尤其重要。title 常表现为鼠标悬停提示,但它不稳定地出现在触摸、键盘和读屏体验中,不能取代 alt。需要额外说明时可用邻近可见文字或图题,不必把同一句话同时塞进两个属性。
type="radio" 适合一组互斥选项,同一表单里相同 name 的单选按钮组成一组,一次通常只能选一个。type="checkbox" 表示可独立勾选的选项,多项可同时选中。
<label for="id"> 的 for 值对应某个可标注表单控件的唯一 id。关联后,点标签文字也能聚焦输入框或切换复选框,并给控件提供可理解的名称。也可以把控件直接放进 <label> 做隐式关联。
<html lang="zh-CN"> 声明文档主要语言,帮助读屏发音、拼写检查和浏览器语言相关处理。页面局部语言变化时,可在对应元素上另设 lang。lang 不会自动把页面改成从右到左排;文字方向应由 dir 和相应 CSS 规则表达。
<header> 是页面或章节的引导内容,<footer> 是对应页面或章节的页脚信息;它们不只按屏幕顶部、底部的位置命名。<main> 标记文档主要内容,通常一个页面只应有一个当前可见的主内容区域,并且不应放进 header、footer、nav 等结构中。
<input type="text"> 是单行文本控件,用户输入的换行不会作为多行编辑界面呈现;<textarea> 是专门的多行文本控件。textarea 的初始值写在开始和结束标签之间,不写 value 内容属性。
<meta http-equiv> 是 HTML 中少数被浏览器识别的 pragma 指令,不是任意 HTTP 头的通用替代。常见的有 refresh、content-security-policy,以及历史兼容或内容类型相关形式。
<meta http-equiv="refresh"> 能在指定秒数后刷新或跳转,但自动动作会打断阅读、输入和读屏操作;倒计时不清楚时,用户更难掌控页面。需要真正的永久或临时地址迁移,优先用 HTTP 重定向。
外部模块脚本及其依赖可与 HTML 解析并行获取,默认等文档解析完成后执行,行为类似普通脚本加 defer。模块默认是严格模式,顶层声明不会自动挂到全局对象。给模块脚本再加 defer 没有效果;加 async 则会改成依赖可用后尽快执行,不再按默认的解析后顺序等待。
<nav> 表示用于页面或站点主要导航的一组链接,如主菜单、目录、分页或面包屑。普通正文里的每个链接不必放进 nav;看的是这组链接是否承担导航结构。一个页面可以有多个 nav,但多个导航区最好用可见标题或 aria-label 给出可区分的名称,便于读屏用户选择。
<output> 表示由计算或用户操作产生的结果,例如滑块选择数量后显示总价。它具有表单结果语义,可用 for 列出参与计算的控件 id,也可用 name 让脚本和表单结构更易识别。
<picture> 让浏览器按条件在多个 <source> 中选来源,适合换构图或格式。每个来源的 media 或 type 决定它是否可用,srcset 提供该来源的候选文件;使用宽度描述符时,sizes 告诉浏览器预计显示宽度。
<progress> 表示一个任务的完成进度,例如文件上传到 60%;没有 value 时表示进度未知。<meter> 表示已知范围内某个量的当前值,例如电量、评分或磁盘占用,它不是正在执行任务的进度条。