Javascript 不正确提交铬合金和边缘的换行符

Javascript 不正确提交铬合金和边缘的换行符,javascript,html,reactjs,Javascript,Html,Reactjs,背景:我们正在使用Typescript和React为WinForms应用程序生成基于浏览器的替代品。该前端通过C#API层将数据存储到SQL数据库 问题:我发现,当使用允许多行输入和显示时,Chrome和Edge只将换行符作为LF提交,而Firefox中的换行符是CRLF。声明LF应在内部用于确定长度等,但在提交内容时应将换行符转换为CRLF 由于历史原因,元素的值在三个方面进行了规范化 不同的方法有三个不同的目的。原始值为 初始设置的值。它不是标准化的。API值为 值IDL属性、textLen

背景:我们正在使用Typescript和React为WinForms应用程序生成基于浏览器的替代品。该前端通过C#API层将数据存储到SQL数据库

问题:我发现,当使用
允许多行输入和显示时,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,因此这不太有效。请参阅我的编辑,了解我们已实施的工作环境。