现代浏览器已移除 wrap="hard" 的自动换行插入功能,仅 wrap="soft"(默认)不影响 value;换行显示应使用 white-space: pre-wrap,提交前需用 JS 统一清洗换行符,服务端须兼容多种换行格式。

wrap="hard" 在现代浏览器里基本不生效
写了 wrap="hard" 却发现提交时没多出 \r\n?不是你配错了,是 Chrome、Firefox、Edge、Safari 自 2019 年起已逐步移除该行为支持。Firefox 68+、Chrome 80+、Safari 14+ 都不再在表单提交时自动插入视觉折行位置的 \r\n。即使你同时写了 cols="40",textarea.value 和实际 POST 数据里依然只有用户按 Enter 输入的换行符(通常是 \n 或 \r\n),不会因“显示折了”就多出换行。
wrap="soft" 只管显示,不管 value
wrap="soft" 是默认值,但它既不添加、也不删除、更不修改 textarea.value 中的任何字符。用户按 Enter 输入的换行符原样保留;粘贴进来的 \r、\r\n、\n 甚至 Unicode 换行符(如 U+2028)也照单全收。常见误解是:“文字在框里折行了,但后端收到的是单行”,其实问题不在 wrap,而在 CSS 覆盖了默认渲染,比如写了 white-space: nowrap 或容器没设宽度,导致浏览器无法判断何时该折。
真正可控的换行显示靠 white-space: pre-wrap
想让用户敲的 \n 在页面上真实换行、同时允许长单词自动折行?wrap 属性做不到。white-space: pre-wrap 才是正解:它保留换行符和空格,又支持软折行。配合 overflow-wrap: break-word 防纯英文/数字撑爆容器;别用 word-break: break-all,它会把“JavaScript”切成 “Java-Script”,体验差。
提交前必须用 JS 清洗换行符
别指望 wrap 帮你区分“用户主动换行”和“渲染副作用换行”。实操建议如下:
立即学习“前端免费学习笔记(深入)”;
- 监听
submit事件,不要在input或keydown中改value(中文输入法会丢字、光标跳位) - 统一转为 LF:
textarea.value.replace(/\r\n|\r/g, '\n') - 删结尾空行:
.replace(/\n(?=\s*$)/g, '') - 若需按行处理(如配置项),用
textarea.value.split('\n').filter(line => line.trim())
服务端永远不能信任前端传来的换行格式——哪怕你做了所有清洗,仍可能收到 \r\n(Windows)、\n(macOS)、\r(老终端)或 U+2028(Word 粘贴)。后端解析必须用 /[\r\n\u2028\u2029]+/g 切分,入库前统一存为 \n。



















