如何防止剪贴板回车变成换行符

时间:2019-05-26 17:31:06

标签: javascript

我正在出于教育目的编写密码算法,我需要能够复制/粘贴unicode字符。
问题是剪贴板(不仅是API)将回车符(十六进制:0x0d,十进制:13)修改为换行符(十六进制:0x0a,十进制:10)。
如何防止这种行为?

let $ = s => document.querySelector(s);

let cr = String.fromCharCode(0x0d);

$("#one").addEventListener("click", function (e)
{
	navigator.clipboard.writeText(cr);
});

$("#two").addEventListener("change", function (e)
{
	$("#out").textContent = "0x" + this.value.charCodeAt(0).toString(16).padStart(2, 0);
});
<button id="one">copy cr to clipboard</button><br>
<textarea type="text" id="two"></textarea><br>
<div id="out"></div>

您可以通过单击按钮将回车符保存到剪贴板中,然后将其粘贴到文本区域中来进行测试。 然后在文本区域外单击以触发更改事件。 因为剪贴板已将cr变成lf,所以它将显示0x0a。

PS:我必须从引导模式转到传统模式,因为它有故障,确实很烦人

1 个答案:

答案 0 :(得分:0)

它与剪贴板无关:

const $ = s => document.querySelector(s);
const cr = String.fromCharCode(0x0d);
const firstCharAsHex = v => "0x" + v.charCodeAt(0).toString(16).padStart(2, 0);

$("#one").addEventListener("click", async function (e) {
  navigator.clipboard.writeText(cr);
  
  const v = await navigator.clipboard.readText();
  console.log("Written: " + firstCharAsHex(v));
});


$("#two").addEventListener("paste", function (e) {
  const v = e.clipboardData.getData('text/plain');
  console.log("Being paste: " + firstCharAsHex(v));
});

$("#two").addEventListener("change", function (e) {
  const v = this.value
  console.log("After paste: " + firstCharAsHex(v));
});
<button id="one">Run</button><br>
<textarea type="text" id="two"></textarea><br>

Textarea将CR标准化为LF。参见specs

  

出于历史原因,出于三种不同目的,以三种不同方式对元素的值进行了标准化。

     
      
  • raw value是最初设置的值。未标准化。
  •   
  • API value是在value IDL属性,textLength IDL属性以及maxlengthminlength内容属性中使用的值。 已规范化,以便换行符使用U + 000A LINE FEED(LF)字符
  •   
  • 最后,有value,在本规范的表单提交和其他处理模型中使用。进行了规范化,以便换行符使用U + 000D回车U + 000A换行符(CRLF)字符对,此外,如果需要,请根据元素的wrap属性,插入其他换行符以将文本换行给定的宽度。
  •