你能制作一个没有自动编辑文字的文本区域吗?

时间:2016-11-01 17:09:27

标签: javascript html

我正在编写一个脚本,该脚本从文件中获取文本并在末尾添加/编辑校验和(使用文本编辑器,如记事本++来往/来自硬盘)。

当您复制/粘贴时,浏览器textarea会将\n\r\n转换为\n,然后转换为\n\r\n时转到另一个程序(取决于您所在的操作系统)。这会使校验和不正确(即使您忽略了校验和本身中任何不可打印字符的重写)。

我想我可以通过打开/保存文件对话框来绕过这个(只要这里没有任何类似的惊喜),但是还有其他项目也会有用。

2 个答案:

答案 0 :(得分:0)

您可以尝试将<pre>元素与contenteditable="true"属性一起使用,而不是使用textarea。这理论上应该保留输入。

编辑我

您可以截取onpaste事件并将\r\n的所有实例标准化为\n,然后生成校验和。 JavaScript可能如下所示:

var input_el = document.querySelector('.your-textarea');

input_el.onpaste = function(e){
  typeof e !== 'undefined' && e.preventDefault();      

  var clipbd_data;

  // handle IE edge case
  if (window.clipboardData && window.clipboardData.getData) {
    clipbd_data = window.clipboardData.getData('Text').replace(/\r\n/g, "\n").replace(/^(.*)\n*$/gm, "$1");
  }
  else if (e.clipboardData && e.clipboardData.getData) {
    clipbd_data = e.clipboardData.getData('text/plain').replace(/\r\n/g, "\n").replace(/^(.*)\n*$/gm, "$1");
  }
  else {
    return; // functionality not supported
  }

  input_el.value = clipbd_data;

  return false;

};

注意:我没有测试过这个。

Source for regex

编辑II

拦截复制事件

首先,将以下onclick处理程序添加到textarea:

<textarea class="your-textarea" onfocus="this.select()" onclick="this.focus();this.select()">
</textarea>
<!-- could optionally add ontouchstart="this.select()" for phones, if you need to -->

这很重要,因为我们正在拦截copy事件 - 这并不是说我们可以抓取用户复制的确切数据,因为它们还没有复制它,所以我们需要强制用户自动选择textarea中的所有文本,这样我们就可以将textarea的全部内容传递给剪贴板(标准化后)。这应该是用户想要做的事情,所以它不应该提出可用性问题......

现在,拦截副本并添加自己的文字:

var txt_area = document.querySelector('.your-textarea');

txt_area.addEventListener('copy', function(e){
  // stop the normal copy behaviour
  typeof e !== 'undefined' && e.preventDefault();

  // get the contents of the textarea
  var txt_before = txt_area.value;

  // normalise
  var txt_after = txt_before.replace(/\r\n/g, "\n").replace(/^(.*)\n*$/gm, "$1");

  e.clipboardData.setData('text/plain', txt_after);
});

答案 1 :(得分:0)

看起来这可能是不可能的,所以我发布了另一个问题,即使用不同的方法将数据从javascript传输到文件而不会被破坏。请参阅&#34; Keep javascript blob from editing data when saving file&#34;