我正在编写一个脚本,该脚本从文件中获取文本并在末尾添加/编辑校验和(使用文本编辑器,如记事本++来往/来自硬盘)。
当您复制/粘贴时,浏览器textarea会将\n
和\r\n
转换为\n
,然后转换为\n
或\r\n
时转到另一个程序(取决于您所在的操作系统)。这会使校验和不正确(即使您忽略了校验和本身中任何不可打印字符的重写)。
我想我可以通过打开/保存文件对话框来绕过这个(只要这里没有任何类似的惊喜),但是还有其他项目也会有用。
答案 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;
};
注意:我没有测试过这个。
拦截复制事件
首先,将以下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;