inputtype="email"的value仍是字符串而非数组,浏览器仅放宽校验允许逗号/分号/空格分隔的邮箱串,需手动split(/[,;\s]+/)、trim()、filter(Boolean)解析,后端接收的也是单个编码字符串而非数组。

input[type="email"]加multiple后,value还是字符串,不是数组
加了 multiple,浏览器只放松校验——允许你输入 a@b.com, c@d.org, e@f.net 这样的逗号/分号/空格分隔串,但 input.value 拿到的永远是完整字符串,不是数组。JS 里直接 console.log(input.value) 看到的就是那个带逗号的原始文本。
常见错误现象:以为 input.files 那套逻辑也适用于 email,结果调用 input.value.forEach 报错;或者在表单提交后,后端收到的是一个 URL 编码后的长字符串(如 email=a%40b.com%2C+c%40d.org),而非多个独立字段。
- 必须手动解析:用
split(/[,;\s]+/)拆分,再map(s => s.trim())去空格,最后filter(Boolean)去掉空项 - 这个正则不处理引号包裹的邮箱(如
"a,b@c.com", d@e.f),那种场景得上更复杂的 parser,别硬撑 - 用户粘贴时可能带零宽字符(U+200B),
trim()无效,得额外清理:.replace(/\u200b/g, '')
提交时后端收不到数组,只收到一个编码字符串
浏览器从不把 multiple 的 email 当成多个同名参数发送。它走的是传统 name=value 单值提交路径,和 type="text" 完全一样。PHP 的 $_POST['email']、Node.js 的 req.body.email 都是字符串,不是数组。
如果你的后端接口期望接收多个 email 字段(比如 email=a@b.com&email=c@d.org),那前端就得绕开原生表单提交,自己构造:
立即学习“前端免费学习笔记(深入)”;
- 用
FormData手动 append 每个邮箱:emails.forEach(e => fd.append('email', e)) - 或改用 JSON 提交:
fetch('/api', { method: 'POST', body: JSON.stringify({ emails }) }) - 别指望
enctype="multipart/form-data"有帮助——它只影响 file 类型,对 email 无效
移动端和 UI 上没任何增强,只是校验变松了
加了 multiple 不会让软键盘多出“添加邮箱”按钮,也不会弹出邮箱建议列表,更不会自动补全。它就是一个普通文本框,唯一变化是浏览器不再拦着你输多个邮箱——仅此而已。
容易踩的坑:
-
required只检查字符串非空," , , @"或"@@"都能过校验 - 老 Android WebView(如 4.4)可能直接忽略
multiple,输入多个邮箱仍被当非法格式报错 - 别和
select[multiple]混:后者选的是预设项,不能自由输入新邮箱,也不做格式校验
真正起作用的只有校验豁免,其余全是你的活
multiple 对 type="email" 来说,就干一件事:让浏览器跳过“只能输一个邮箱”的基础校验。所有后续工作——去重、过滤无效格式(比如 user@@domain.com)、防注入、拆分入库、发验证邮件——都得你自己写。
最容易被忽略的点是:它不提供任何数据结构保障,也不改变传输语义。你看到的“支持多邮箱”,其实是把解析责任甩给了开发者,而不是交给浏览器。



















