我在我的博客上写了一篇关于此的更详细的帖子: 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
我生气了,还是这个错误?
干杯, 特里
答案 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编码为
和
,甚至可以将空格编码为{ {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
)..