为什么Javascript将回车符只计算为一个字符,而实际上它是两个字符?

16

4
这是您的答案,并附有证据:http://www.whatwg.org/specs/web-apps/current-work/multipage/the-button-element.html#concept-textarea-api-value - user1385191
1个回答

26
出于某种未知原因,jQuery总是将<textarea>的值中的所有换行符转换为一个字符。也就是说,如果浏览器给出\r\n作为换行符,jQuery会确保在.val()的返回值中只有\n。(实际上,这个原因可能并不是“未知”的;它很可能是为了规范化跨浏览器的结果,因为IE将换行符报告为长度为2的字符。)
Chrome和Firefox对于"maxlength"属性的目的都以相同的方式计算<textarea>标签的长度。
然而,HTTP规范要求换行符表示为\r\n。因此,jQuery、Webkit和Firefox都做错了。当提交表单时,WebKit和Firefox会正确地添加换行符!
总之,如果你的服务器端代码真的有一个固定的最大字段值,那么<textarea>标签上的"maxlength"属性几乎是无用的。 编辑:在2015年仍然存在这个问题-至少在Chrome 45.0.2454和IE 11.0.9600上。

3
总之,如果你的服务器端代码确实有一个固定的字段值最大大小,那么<textarea>标签上的“maxlength”就几乎无用了。您感到困惑,似乎jQuery将换行符报告为单个字符,但浏览器正确地使用两个字符。如果是这样,那么maxlength属性实际上会正确工作,并将换行符计为两个字符,这是数据将保存在后端的方式。 - wired_in
1
@wired_in 不,因为浏览器维护者是奇怪的人,他们似乎不理解maxlength的整个含义(我的个人看法)。我已经在Firefox和WebKit上记录了错误,并且我收到了大量奇怪的不明智的回应。 maxlength实现检查由.value返回的长度,也就是说 没有 提交表单时引入的CR字符长度。我已经开始使用我的JavaScript解决方案了。 - Pointy
1
maxlength 实现检查 .value 返回的长度,也就是没有 CR 字符的长度。” - 实际上正好相反,maxlength 计算 CR+LF 的字符数(JavaScript 不计入),如上面的 jsfiddle 示例和链接问题所示。因此,就服务器端代码而言,maxlength 是正确的,只有当你还想用客户端 JavaScript 处理它时,才会出现“问题”。 - MrWhite
1
@w3d 等等,我收回之前的话——请看这个非常简单的jsfiddle。输入内容,包括硬回车,观察Firefox允许你输入多少字符。显然Firefox 40.0.3将硬回车视为1个字符,而不是2个字符。 - Pointy
1
@scunliffe 我也不明白为什么\r是必须的,所以去掉它也没关系。这只是一个奇怪的情况。 - Pointy
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接