Chrome中的错误或用户的愚蠢?消除表格上的输入?

时间:2010-07-14 13:02:45

标签: webforms google-chrome

我在我的博客上写了一篇关于此的更详细的帖子: http://idisposable.co.uk/2010/07/chrome-are-you-sanitising-my-inputs-without-my-permission/

但基本上,我有一个字符串:

||abcdefg
hijklmn
opqrstu
vwxyz
||

我添加的管道用于指示字符串的开始和结束位置,特别注意最后一行的最终回车。

我需要将其放入隐藏的表单变量中以便发送给供应商。

基本上,除了chrome之外的任何浏览器,我得到以下内容:

<input type="hidden" id="pareqMsg" value="abcdefg
hijklmn
opqrstu
vwxyz
" />

但是在chrome中,它似乎应用了.Trim()或其他能给我的东西:

<input type="hidden" id="pareqMsg" value="abcdefg
hijklmn
opqrstu
vwxyz" />

注意它已经切断了最后一次回车。这些回车(当编码时)如果有帮助则显示为%0A。

基本上,在除Chrome之外的任何浏览器中,整个过程都有效,我从第三方得到了所需的响应。在Chrome中,我收到一条“无效的pareq”消息(这告诉我,最后一次回车对供应商很重要)。

Chrome版本为5.0.375.99

我生气了,还是这个错误?

干杯, 特里

3 个答案:

答案 0 :(得分:2)

您不能依赖表单提交来保存隐藏字段值中包含的确切字符数据。我过去曾遇到过将Firefox CRLF(\r\n)序列转换为裸LF的问题,而您的经验表明Chrome的行为同样令人困惑。

事实证明,这不是一个真正的错误。

请记住,您在此处提供的是HTML属性值 - 严格来说,HTML 4 DTD定义了{CDAME类型} value元素的<input>属性。有关CDATA属性值的HTML规范has this to say

  

用户代理应按如下方式解释属性值:

     
      
  • 用字符替换字符实体
  •   
  • 忽略换行,
  •   
  • 用一个空格替换每个回车或标签。
  •   
     

用户代理可以忽略CDATA属性值中的前导和尾随空格(例如,“myval”可以被解释为“myval”)。作者不应声明具有前导或尾随空格的属性值。

因此,属性值中的空格会受到许多用户代理转换的影响 - 符合标准的浏览器显然应该丢弃所有换行符,而不仅仅是丢失的换行符 - 因此Chrome的行为确实是错误的,但与一个相反的方向你想要的。

但是,请注意,浏览器也应该用字符替换字符实体 - 这表明你应该能够将你的CR和LF编码为&#13;&#10;,甚至可以将空格编码为{ {1}},完全从您的值字段中删除任何实际的空白字符。

然而,正如您所发现的那样,浏览器对这些SGML解析规则的遵从性是不完整的,因此您的里程肯定会有所不同。

答案 1 :(得分:1)

在此确认。它修剪了尾随的CRLF,它们没有被解析到浏览器的DOM中(我假设所有的HTML属性)。

如果您使用脚本附加CRLF,例如

var pareqMsg = document.forms[0]['pareqMsg']
if (/\r\n$/.test(pareqMsg.value) == false)
   pareqMsg.value += '\r\n';

......他们会得到维护并重新发送回服务器。虽然Gaby建议隐藏的<textarea>想法可能更容易!

答案 2 :(得分:0)

通常在输入框中你不能输入(键盘)换行符。所以也许chrome通过属性,值来强制实现这一点。

尝试使用textarea(使用display:none)..