为啥Javascript只将回车计为一个字符,而它是两个?

Posted

技术标签:

【中文标题】为啥Javascript只将回车计为一个字符,而它是两个?【英文标题】:Why does Javascript only count carriage returns as one character when it is two?为什么Javascript只将回车计为一个字符,而它是两个? 【发布时间】:2012-04-19 08:11:19 【问题描述】:

这是这个问题的一个分支:Chrome counts characters wrong in textarea with maxlength attribute


在那个问题中发现javascript counts carriage returns are one character when in fact it is two (\r\n),这是为什么呢?

测试小提琴:http://jsfiddle.net/maniator/E527z/

【问题讨论】:

这是您的答案,有证据:whatwg.org/specs/web-apps/current-work/multipage/… 【参考方案1】:

由于未知的原因,jQuery 总是将 <textarea> 值中的所有换行符转换为单个字符。也就是说,如果浏览器给它\r\n 换行,jQuery 会确保它在.val() 的返回值中只是\n。 (实际上原因可能不是“未知”;可能是为了跨浏览器标准化结果,因为 IE 报告换行符为 2 个字符长。)

Chrome 和 Firefox 都以相同的方式计算 <textarea> 标记的长度,以达到“最大长度”的目的。

但是,HTTP 规范坚持将换行符表示为 \r\n。因此,jQuery、webkit 和 Firefox 都犯了这个错误。字段发布后,webkit 和 Firefox 会正确添加换行符!

如果您的服务器端代码确实为字段值设置了固定的最大大小,那么<textarea> 标签上的“maxlength”几乎毫无用处。

编辑这在 2015 年仍然是一个问题 - 至少在 Chrome 45.0.2454 和 IE 11.0.9600 上。

【讨论】:

"如果你的服务器端代码确实有一个字段值的固定最大大小,那么结果是 @wired_in 不,因为浏览器维护者是奇怪的人,他们似乎并不理解maxlength 的全部意义(我个人的看法)。我已经记录了针对 Firefox 和 WebKit 的错误,并且我得到的奇怪的不知情的回击数量是惊人的。 maxlength 实现检查由.value 返回的长度,也就是说长度没有表单发布时引入的CR 字符。我已经继续前进,我将继续使用我的 JavaScript 解决方案。 "maxlength 实现检查.value 返回的长度,也就是说没有 CR 字符的长度" - 反过来。 maxlength 计算 CR+LF(JavaScript 不计算) - 如上面的 jsfiddle 和链接问题所示。因此,maxlength 对于服务器端代码实际上是正确的,如果您还使用客户端 JavaScript 处理它,这只是一个“问题”。 @w3d 等等,我收回这句话——见this extremely simple jsfiddle。输入内容,包括硬回车,并查看 Firefox 允许您输入多少个字符。 Firefox 40.0.3 显然将硬返回视为 1 个字符,而不是 2 个。 我已经更新了 JS fiddle,以便在您输入 jsfiddle.net/E527z/35 时更快/即时更新,但我没有看到任何浏览器将 textarea 换行符视为 2 个字符 (\r + @ 987654339@) 在 JavaScript 中或在应用 maxlength 属性(包括最高 65/67 的 Chrome)时...提交到服务器时,按照规范的预期,换行符“加倍”为 \r\n

以上是关于为啥Javascript只将回车计为一个字符,而它是两个?的主要内容,如果未能解决你的问题,请参考以下文章

为啥bash只将第一个元素附加到数组

为啥 LINQ 在我的查询中使用错误的数据类型,而它在 EF 架构中被正确声明?

为啥这会给我一个 Java 中的 ClassCastException,而它在 C++ 中运行良好?

为啥只有在按回车后才能在串行连接中收到字符?

为啥 CakePHP 无法为一个控制器创建夹具并返回 SQLSTATE[42000] 而它是为另一个控制器?

为啥 Android Studio 设计器显示我的自定义视图嵌套在自身内部,而它不是