【发布时间】:2015-08-10 17:47:58
【问题描述】:
(使用 Chrome 44 测试)
期望行为:发出 XHR 请求,将结果放入文本区域,选择文本,然后复制到剪贴板。
实际行为:在成功的 XHR 请求时,将结果放入文本区域并选择它,但无法将结果复制到剪贴板。但是如果我在 XHR 回调之外启动复制,它就可以工作。
示例 html 页面:
var selectAndCopy = function() {
// Select text
var cutTextarea = document.querySelector('#textarea');
cutTextarea.select();
// Execute copy
var successful = document.execCommand('copy');
var msg = successful ? 'successful' : 'unsuccessful';
console.log('Cutting text command was ' + msg);
};
var fetchCopyButton = document.querySelector('#fetch_copy');
fetchCopyButton.addEventListener('click', function(event) {
var xhr = new XMLHttpRequest();
xhr.open('get', 'http://httpbin.org/ip');
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
// Set text
var textarea = document.querySelector('#textarea');
textarea.value = xhr.responseText;
selectAndCopy();
}
}
};
xhr.send();
});
var copyButton = document.querySelector('#copy');
copyButton.addEventListener('click', function(event) {
selectAndCopy();
});
<html>
<head>
</head>
<body>
<p>
<textarea id="textarea">Hello, I'm some text!</textarea>
</p>
<p>
<button id="fetch_copy">Fetch Data and Copy Textarea</button>
<button id="copy">Copy Textarea</button>
</p>
</body>
</html>
如果您按下“获取数据并复制文本区域”按钮,则数据成功获取但未复制。如果您按下“复制文本区域”按钮,则会按预期复制文本。我尝试了许多请求/复制的组合来尝试让它工作但无济于事(包括在获取数据后以编程方式按下复制按钮)。有谁知道这里发生了什么?这是安全功能还是什么?
如果可能的话,我不希望用户必须按两个按钮来获取和复制。
【问题讨论】:
-
那你最后是怎么解决的呢?你能更新一下问题吗?
-
@ChrisGeo 我最终只选择了文本(但没有复制它)。我意识到如果我在他们的复制缓冲区中覆盖了某些内容,用户可能不会高兴。 Trevor 在下面的回答看起来会起作用(如果您对同步 XHR 没问题)
-
这个问题在我的回答中解决了 :) 这里:stackoverflow.com/questions/43380921/…
-
也许,你可以做一些我在这里提到的事情:SOLVED: document execCommand copy not working with AJAX
-
如果操作是从
trusted事件发起的,这里有一个使用setTimeout的黑客攻击:stackoverflow.com/a/40826549/3649573
标签: javascript html ajax copy execcommand