datalist 在 IE 全版本中完全不支持,Safari 15.3 及更早版本仅支持键盘方向键选择、不响应鼠标点击,部分旧版 Android WebView 存在建议不弹出或 option 值失效问题;需通过 JS 检测并降级为 select,同步值与事件,注意语义一致性。
datalist 在 IE 全版本中完全不支持,Safari 15.3 及更早版本仅支持键盘方向键选择、不响应鼠标点击,部分旧版 Android WebView 也存在建议不弹出或 option 值失效的问题。
IE 不识别 datalist 标签,会将其当作未知元素忽略,既不渲染也不触发任何行为。它不会自动退化为 select,也不会报错——只是静默失效。
datalist 内容if (!('list' in document.createElement('input'))) 是最轻量的检测方式option 的 value 搬到 select 中,并同步绑定原 input 的值和事件select 的 change 事件触发时机与现代浏览器不同,需用 click 或 focusout 补充监听Safari ≤15.3 会渲染下拉建议框,但点击选项无反应,用户只能用 ↑/↓ + Enter 选中——这对触屏设备或不熟悉键盘操作的用户极不友好。
navigator.userAgent.includes('Safari') && !navigator.userAgent.includes('Chrome'),再结合版本号正则提取select 替代方案datalist,需额外加一段 JS:监听 input 的 keydown,拦截 Enter 并手动设置值,避免用户输完按回车却没提交成功input 的 list 属性,否则 Safari 仍会尝试加载空建议框很多 Android 系统自带 WebView(尤其 7.0–9.0)对 datalist 支持不稳定:有的不弹建议,有的弹出但 option 值为空,有的甚至导致页面重绘异常。
Modernizr.input.list(需引入 Modernizr)或手写检测函数:const hasDatalist = 'list' in document.createElement('input') && !!document.createElement('datalist').options
select 并隐藏原 input,保持表单结构一致select 方案,PC 端再走 datalist,比运行时检测更稳定真正麻烦的不是“要不要降级”,而是降级后如何让 select 的交互语义和原 input 保持一致:比如用户本可输入任意值,但 select 强制选值;或者提交时后端期望的是自由文本而非选项 ID。这些语义断层,得靠 JS 显式桥接,不能只换标签了事。