为何FormData提交textarea内容时自动插入回车符导致长度校验失败?
原因说明
- 这是HTML表单的标准规定:按照W3C的HTML规范,表单提交的textarea内容,所有换行符必须统一转换为
\r\n(CRLF)格式,与客户端操作系统无关,目的是消除不同系统换行符标准的差异,保证服务端收到的内容格式一致。 - 你观测到的浏览器差异属于FormData API的实现不一致:Chrome在构造FormData实例时就完成了换行符转换,因此
FormData.get()直接返回带\r\n的内容;Firefox的旧版本在构造阶段没有转换,但是在实际将FormData序列化为请求体发送时,还是会统一转换成\r\n,这也是为什么你测试时POST数据的换行符全是\r\n。
适配基于FormData做校验的解决方案
你不想直接校验textarea原值的话,可以选以下两种方案:
- 方案一:在校验前统一转换FormData值的换行符,和实际提交格式对齐
不需要修改提交逻辑,只需要在校验时对读取到的FormData值做一次统一替换即可:
// 封装读取方法,保证返回值和实际提交的格式完全一致 function getNormalizedFormDataValue(formData, fieldName) { const rawValue = formData.get(fieldName); // 把所有换行符统一替换为CRLF,避免重复替换已经存在的\r\n return rawValue.replace(/\r?\n/g, '\r\n'); } // 使用示例 const normalizedVal = getNormalizedFormDataValue(formData, 'history'); console.log(normalizedVal.length); // 计算得到的长度和实际提交的长度完全一致
- 方案二:手动构造FormData,禁用自动换行转换
如果你希望提交的内容保留原始的\n换行符,可以不直接从表单实例生成FormData,手动读取textarea的原始值添加到FormData中,浏览器就不会执行自动转换:
const form = document.getElementById('form'); const fd = new FormData(); // 手动添加所有表单字段,textarea值用原始读取的内容,不会自动插入\r fd.append('history', document.getElementById('id_history').value); // 其他字段也可以手动append,或者遍历表单元素批量添加
内容的提问来源于stack exchange,提问作者Gwanghyeon Gim
相关产品推荐
相关产品推荐

