Javascript execCommand(';copy';)在Ajax/XHR回调中不起作用?

Javascript execCommand(';copy';)在Ajax/XHR回调中不起作用?,javascript,html,ajax,copy,execcommand,Javascript,Html,Ajax,Copy,Execcommand,(使用铬44进行测试) 所需行为:发出XHR请求,将结果放入文本区域,选择文本,然后复制到剪贴板 实际行为:在成功的XHR请求中,将结果放入文本区域并选择它,但无法将结果复制到剪贴板。但是如果我在XHR回调之外启动复制,它就会工作 html页面示例: var selectAndCopy=function(){ //选择文本 var cutTextarea=document.querySelector('#textarea'); cutTextarea.select(); //执行副本 var

(使用铬44进行测试)

所需行为:发出XHR请求,将结果放入文本区域,选择文本,然后复制到剪贴板

实际行为:在成功的XHR请求中,将结果放入文本区域并选择它,但无法将结果复制到剪贴板。但是如果我在XHR回调之外启动复制,它就会工作

html页面示例:

var selectAndCopy=function(){
//选择文本
var cutTextarea=document.querySelector('#textarea');
cutTextarea.select();
//执行副本
var successful=document.execCommand('copy');
var msg=successful?'successful':'successful';
log('剪切文本命令为'+msg');
};
var fetchCopyButton=document.querySelector('fetch#u copy');
fetchCopyButton.addEventListener('click',函数(事件){
var xhr=new XMLHttpRequest();
xhr.open('get','http://httpbin.org/ip');
xhr.onreadystatechange=函数(){
if(xhr.readyState==4){
如果(xhr.status==200){
//设置文本
var textarea=document.querySelector('#textarea');
textarea.value=xhr.responseText;
选择并复制();
}
}
};
xhr.send();
});
var copyButton=document.querySelector(“#copy”);
copyButton.addEventListener('click',函数(事件){
选择并复制();
});


你好,我是一些文字!

获取数据并复制文本区域 复制文本区


您只能触发复制到系统剪贴板,以直接响应受信任的用户操作,例如
单击事件


规格:

您只能触发复制到系统剪贴板,以直接响应受信任的用户操作,例如
单击事件

规范:

免责声明:不建议在主线程上使用同步XMLHttpRequests。在使用此解决方案之前,请阅读并确保您知道自己在做什么。这不建议用于生产。

如果您使XMLHttpRequest同步,这将起作用。只需将
false
作为第三个参数添加到
xhr.open(…)

var selectAndCopy=function(){
//选择文本
var cutTextarea=document.querySelector('#textarea');
cutTextarea.select();
//执行副本
var successful=document.execCommand('copy');
var msg=successful?'successful':'successful';
log('剪切文本命令为'+msg');
};
var fetchCopyButton=document.querySelector('fetch#u copy');
fetchCopyButton.addEventListener('click',函数(事件){
var xhr=new XMLHttpRequest();
xhr.open('get','http://httpbin.org/ip",假),;
xhr.onreadystatechange=函数(){
if(xhr.readyState==4){
如果(xhr.status==200){
//设置文本
var textarea=document.querySelector('#textarea');
textarea.value=xhr.responseText;
选择并复制();
}
}
};
xhr.send();
});
var copyButton=document.querySelector(“#copy”);
copyButton.addEventListener('click',函数(事件){
选择并复制();
});


你好,我是一些文字!

获取数据并复制文本区域 复制文本区

免责声明:不建议在主线程上使用同步XMLHttpRequests。在使用此解决方案之前,请阅读并确保您知道自己在做什么。这不建议用于生产。

如果您使XMLHttpRequest同步,这将起作用。只需将
false
作为第三个参数添加到
xhr.open(…)

var selectAndCopy=function(){
//选择文本
var cutTextarea=document.querySelector('#textarea');
cutTextarea.select();
//执行副本
var successful=document.execCommand('copy');
var msg=successful?'successful':'successful';
log('剪切文本命令为'+msg');
};
var fetchCopyButton=document.querySelector('fetch#u copy');
fetchCopyButton.addEventListener('click',函数(事件){
var xhr=new XMLHttpRequest();
xhr.open('get','http://httpbin.org/ip",假),;
xhr.onreadystatechange=函数(){
if(xhr.readyState==4){
如果(xhr.status==200){
//设置文本
var textarea=document.querySelector('#textarea');
textarea.value=xhr.responseText;
选择并复制();
}
}
};
xhr.send();
});
var copyButton=document.querySelector(“#copy”);
copyButton.addEventListener('click',函数(事件){
选择并复制();
});


你好,我是一些文字!

获取数据并复制文本区域 复制文本区


Synchronous XHR通常是个坏主意,但如果没有它,很难一步到位。此外,在Chrome的控制台中,您会收到关于同步XHR请求的警告。是的,这是个坏主意,但我已经看到,使同步XHR工作起来是可行的!当我将其设置为异步时,Firefox抱怨“document.execcommand('copy')被拒绝,因为它不是从短时间运行的用户生成的事件处理程序中调用的”,但是,当Ajax调用被设置为同步时,没有问题!!!原因可能是什么?同步XHR通常是个坏主意,但如果没有它,很难一步到位。此外,在Chrome的控制台中,您会收到关于同步XHR请求的警告。是的,这是个坏主意,但我已经看到,使同步XHR工作起来是可行的!当我将其设置为异步时,Firefox抱怨“document.execcommand('copy')被拒绝,因为它不是从短时间运行的用户生成的事件处理程序中调用的”,但是,当Ajax调用被设置为同步时,没有问题!!!原因可能是什么?那么你最终是如何解决的呢?你能更新这个问题吗?@ChrisGeo我只是选择了文本(但没有复制)。我意识到如果我在他们的拷贝缓冲区中重写了一些东西,用户可能不会高兴。特雷弗的答案是b