为啥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只将回车计为一个字符,而它是两个?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 LINQ 在我的查询中使用错误的数据类型,而它在 EF 架构中被正确声明?
为啥这会给我一个 Java 中的 ClassCastException,而它在 C++ 中运行良好?