Javascript 不正确提交铬合金和边缘的换行符
背景:我们正在使用Typescript和React为WinForms应用程序生成基于浏览器的替代品。该前端通过C#API层将数据存储到SQL数据库 问题:我发现,当使用Javascript 不正确提交铬合金和边缘的换行符,javascript,html,reactjs,Javascript,Html,Reactjs,背景:我们正在使用Typescript和React为WinForms应用程序生成基于浏览器的替代品。该前端通过C#API层将数据存储到SQL数据库 问题:我发现,当使用允许多行输入和显示时,Chrome和Edge只将换行符作为LF提交,而Firefox中的换行符是CRLF。声明LF应在内部用于确定长度等,但在提交内容时应将换行符转换为CRLF 由于历史原因,元素的值在三个方面进行了规范化 不同的方法有三个不同的目的。原始值为 初始设置的值。它不是标准化的。API值为 值IDL属性、textLen
允许多行输入和显示时,Chrome和Edge只将换行符作为LF提交,而Firefox中的换行符是CRLF。声明LF应在内部用于确定长度等,但在提交内容时应将换行符转换为CRLF
由于历史原因,元素的值在三个方面进行了规范化
不同的方法有三个不同的目的。原始值为
初始设置的值。它不是标准化的。API值为
值IDL属性、textLength IDL属性中使用的值,
以及maxlength和minlength内容属性。它是
标准化,以便换行符使用U+000A换行符(LF)字符。
最后,还有一个值,在表单提交和其他应用程序中使用
本规范中的处理模型。它是标准化的,因此
换行符使用U+000D回车符U+000A换行符(CRLF)字符
成对,此外,如果必要,给定元素的换行
属性时,将插入其他换行符以在
给定宽度
获取元素API值的算法是返回
元素的原始值,并规范化换行符
元素的值被定义为元素的原始值
已应用textarea包装转换。文本区域包装
转换是应用于字符串的以下算法:
替换每次出现的U+000D回车(CR)字符(后面不跟U+000A换行(LF)字符),以及
U+000A换行符(LF)前面不带
U+000D回车(CR)字符,由两个字符串组成
由U+000D回车U+000A换行器(CRLF)组成
字符对
如果元素的换行属性处于硬状态,请将U+000D回车U+000A换行符(CRLF)字符对插入到
字符串使用实现定义的算法,以便每行
具有的字符宽度不超过个字符。为此目的
要求,行由字符串的开头和结尾分隔
字符串和U+000D回车U+000A换行符(CRLF)
字符对
这是Chrome/Edge及其HTML5实现的问题,React是如何处理这些值的,还是我们使用React
创建元素的代码将导致:
const [text, setText] = setState<string>("");
<textarea
value={text}
onChange={(e) => setText(e.target.value)}
/>
const[text,setText]=setState(“”);
setText(e.target.value)}
/>
编辑:
作为一种解决方法,我将上述代码修改为
<textarea
value={text}
onChange={(e) => setText(e.target.value
?.split(/\r?\n/).join('\r\n')
.split(/\r\n?/).join('\r\n'))}
/>
setText(如target.value
?.split(/\r?\n/).join('\r\n')
.split(/\r\n?/).join('\r\n'))}
/>
我仍然有兴趣知道这是否是浏览器/React的问题。更改后端对数据的期望。
有时我发现C#做了C#想要做的事情,只需编写正确的实现就更容易了。在提交期间,我将使用JS将文本区域转换为数组,类似于:
textArea.split("\n");
然后在C上,期望一个字符串[],并用C重新合并它,类似于
string.Join("correct CLFR character", textArea);
这不是一个很好的解决方案,但有些战斗不值得去战斗。这是正确的。我添加了一个链接。由于Firefox正在从textarea返回,\r\n,因此这不太有效。请参阅我的编辑,了解我们已实施的工作环境。