Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我会得到重复的文本,并带有;粘贴";textarea上的事件?_Javascript_Html - Fatal编程技术网

Javascript 为什么我会得到重复的文本,并带有;粘贴";textarea上的事件?

Javascript 为什么我会得到重复的文本,并带有;粘贴";textarea上的事件?,javascript,html,Javascript,Html,var txarea=document.getElementById('source'); txarea.addEventListener('paste',function(){ 设text=txarea.value; console.log(文本); 让replace\u text=text.replace(/\n/g,“”) console.log(替换_文本); txarea.value=替换_文本; }); 让我们分析一下测试用例及其与代码的交互方式 用户选择文本区域中的所有文本 用户发


var txarea=document.getElementById('source');
txarea.addEventListener('paste',function(){
设text=txarea.value;
console.log(文本);
让replace\u text=text.replace(/\n/g,“”)
console.log(替换_文本);
txarea.value=替换_文本;
});

让我们分析一下测试用例及其与代码的交互方式

  • 用户选择文本区域中的所有文本
  • 用户发起“粘贴”
  • 在粘贴发生之前,将触发回调
  • 您的回调将文本区域的内容替换为新的修改内容。(将换行符替换为空格。)
  • 由于您已将textarea的内容全部替换为新内容,因此用户的初始文本选择不再有效因此,有效光标位置现在位于新替换内容的末尾。
  • 粘贴时,会将新文本添加到textarea内容的末尾
  • 在步骤#5中,如果文本未被修改(即没有换行符开始),则选择仍然有效,粘贴将作为替换而不是附加


    我认为你想做的是:

  • 检测到用户正试图粘贴某些文本
  • 在粘贴文本之前对其进行修改。(通过将换行符替换为空格。)

  • 您可以使用找到正在粘贴的文本,即:

    但是,您不希望仅用粘贴的信息替换textarea的内容,也不希望在末尾附加它。如果用户把插入符号放在文本的中间,然后点击CTRL+V?

    怎么办? 进入

    var txarea=document.getElementById('source');
    txarea.addEventListener('paste',函数(e){
    e、 预防默认值();
    让text='';
    if(e.clipboardData | | e.originalEvent.clipboardData){
    text=(e.originalEvent | | e).clipboardData.getData('text/plain');
    }else if(window.clipboardData){
    text=window.clipboardData.getData('text');
    }
    console.log(文本);
    让replace_text=text.replace(/\n/g');
    console.log(替换_文本);
    if(document.queryCommandSupported('insertText')){
    document.execCommand('insertText',false,replace_text);
    }否则{
    document.execCommand('paste',false,replace_text);
    }
    });
    
    让我们分析一下测试用例及其与代码的交互方式

  • 用户选择文本区域中的所有文本
  • 用户发起“粘贴”
  • 在粘贴发生之前,将触发回调
  • 您的回调将文本区域的内容替换为新的修改内容。(将换行符替换为空格。)
  • 由于您已将textarea的内容全部替换为新内容,因此用户的初始文本选择不再有效因此,有效光标位置现在位于新替换内容的末尾。
  • 粘贴时,会将新文本添加到textarea内容的末尾
  • 在步骤#5中,如果文本未被修改(即没有换行符开始),则选择仍然有效,粘贴将作为替换而不是附加


    我认为你想做的是:

  • 检测到用户正试图粘贴某些文本
  • 在粘贴文本之前对其进行修改。(通过将换行符替换为空格。)

  • 您可以使用找到正在粘贴的文本,即:

    但是,您不希望仅用粘贴的信息替换textarea的内容,也不希望在末尾附加它。如果用户把插入符号放在文本的中间,然后点击CTRL+V?

    怎么办? 进入

    var txarea=document.getElementById('source');
    txarea.addEventListener('paste',函数(e){
    e、 预防默认值();
    让text='';
    if(e.clipboardData | | e.originalEvent.clipboardData){
    text=(e.originalEvent | | e).clipboardData.getData('text/plain');
    }else if(window.clipboardData){
    text=window.clipboardData.getData('text');
    }
    console.log(文本);
    让replace_text=text.replace(/\n/g');
    console.log(替换_文本);
    if(document.queryCommandSupported('insertText')){
    document.execCommand('insertText',false,replace_text);
    }否则{
    document.execCommand('paste',false,replace_text);
    }
    });
    
    
    
    复制粘贴只有一行时也会发生同样的情况,例如,
    abc
    @user2342558 Hmm。只要没有换行符,我就不会得到一行文本的重复文本。例如,
    abc
    abc de
    对我来说很好。我使用的是Chrome Ubuntu v77。同样的情况也发生在只复制粘贴一行,例如,
    abc
    @user2342558-Hmm。只要没有换行符,我不会用一行文本获得重复文本。例如,
    abc
    abc de
    对我来说很好。我正在使用Chrome Ubuntu v77。是的。我刚刚发现在粘贴执行之前我正在更改文本。但是为什么在没有换行符的情况下,没有出现意外的文本,例如,
    abc def
    。在粘贴新文本之前,代码基本上删除了所有现有文本中的换行符,然后在函数退出后允许粘贴新文本(未修改)。@Rick注意
    e.preventDefault()在我的函数顶部。我想这可能会帮助你理解对你来说没有意义的部分。对不起@Woodrow Barlow。昨天我太累了,没法回答。。今天我仔细阅读了你的答案,发现这一点很重要,“在第5步,如果文本没有修改(即没有换行符),那么选择仍然有效,粘贴作为替换而不是附加。”这解释了如果内容没有更改,文本不会附加的原因。你去哪儿了
    
    let paste = (event.clipboardData || window.clipboardData).getData('text');