gpt4 book ai didi

javascript - 使用 document.execCommand ('copy' 复制到剪贴板)因大文本而失败

转载 作者:可可西里 更新时间:2023-11-01 02:37:32 25 4
gpt4 key购买 nike

我正在使用一个隐藏的文本区域来放置一些文本,选择它然后使用 document.execCommand 将它复制到剪贴板。这通常有效,但当文本很大时会失败(返回 false)。在 Chrome v55 中,它似乎在 180K 个字符左右失败。

通过这种方式复制的数据量是否有限制?普通的 Ctrl+C 似乎不受相同的限制。

注意:有人将其标记为可能与 Does document.execCommand('copy') have a size limitation? 重复.这可能是类似的问题,但那个问题被标记为我不使用的特定框架,而且也没有得到回答。我相信我的问题更笼统并且仍然相关。

我附上代码以供引用。

      function copyTextToClipboard(text) {
var textArea = document.createElement('textarea');
textArea.style.position = 'fixed';
textArea.style.top = 0;
textArea.style.left = 0;
textArea.style.width = '2em';
textArea.style.height = '2em';
textArea.style.padding = 0;
textArea.style.border = 'none';
textArea.style.outline = 'none';
textArea.style.boxShadow = 'none';
textArea.style.background = 'transparent';
textArea.value = text;
document.body.appendChild(textArea);
textArea.select();
try {
var successful = document.execCommand('copy');
var msg = successful ? 'successful' : 'unsuccessful';
console.log('Copying text command was ' + msg);
} catch (err) {
console.log('Oops, unable to copy');
}
document.body.removeChild(textArea);
}

最佳答案

execCommand('copy') 调用自身相比,这个问题更多地与呈现此长文本所花费的时间有关。

Firefox 引发了一条解释性很强的错误消息:

document.execCommand(‘cut’/‘copy’) was denied because it was not called from inside a short running user-generated event handler.

您的代码生成文本的时间太长,因此浏览器无法将其识别为半可信 事件...

解决方案是首先生成此文本,并且只有在听到用户手势后才能调用 execCommand。因此,为了使其成为可能,您可以例如监听mousedown事件生成文本,只有在mouseup事件中才会真正执行复制命令。

const text = ('some text a bit repetitive ' + Date.now()).repeat(50000);

function copyTextToClipboard(text) {
// first we create the textArea
var textArea = document.createElement('textarea');
textArea.style.position = 'absolute';
textArea.style.opacity = '0';
textArea.value = text;
document.body.appendChild(textArea);

var execCopy = e => { // triggered on mouseup
textArea.select();
var successful = document.execCommand('copy');
var msg = successful ? 'successful' : 'unsuccessful';
console.log('Copying text command was ' + msg);
document.body.removeChild(textArea);
};
// here the magic
btn.addEventListener('mouseup', execCopy, {
once: true
});
}
// triggered on mousedown
btn.onmousedown = e => copyTextToClipboard(text);
<button id="btn">copy some text in your clipboard</button>
<p>May struggle your browser a little bit, it's quite a long text... Please be patient</p>

关于javascript - 使用 document.execCommand ('copy' 复制到剪贴板)因大文本而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44774820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com