我无法使用execCommand('copy'),尝试复制在多选选项中选择的值。我在“temp”中获得了价值,但是临时没有复制或进入剪贴板的价值。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "planCell",for: indexPath) as! MediaPackListCell
cell.lblAllowAutoRenew.textColor = UIColor.white
}
答案 0 :(得分:5)
我了解您的意图如下:您希望在选择后立即将所选选项的值复制到剪贴板。
使用document.execCommand('copy')
时,您可以复制页面上选择的内容(例如段落中的内容或输入字段本身)。
然而,问题是<select>
中的选择选项不被视为选定文本。更糟糕的是,如果您想通过javascript触发选择文字,则有一些限制:您只能在<input>
或<textarea>
元素上致电.select()。
以下是我要做的事情:将所选选项复制到单独的(不可见)输入字段,选择它并从中复制内容。
这是一个可以作为演示的小提琴:https://jsfiddle.net/Zomry/metcfvcq/13/
我会在这里分解:
首先,将此元素添加到页面中。这是输入字段,我们将内容从剪贴板复制到剪贴板。请注意,我添加了tabindex -1,因此您无法通过Tab键访问它。我还包括隐藏的咏叹调,所以屏幕阅读器知道它应该忽略这一点。
<input class='copyfrom' tabindex='-1' aria-hidden='true'>
然后通过将输入字段放在屏幕上使其不可见(如果我尝试使用display:none;或其他技巧则无效)
<style>
.copyfrom {
position: absolute;
left: -9999px;
}
</style>
然后将值复制到输入字段,选择它并复制它。
var input = document.querySelector("input.copyfrom"); // select the input field
function showpropval(val) {
var selectedValues = getSelectValues(this); // get selected values
input.value = test.join(','); // join them in a comma separated list
input.select(); // select offscreen inputs text
document.execCommand("copy"); // copy it
this.focus(); // focus back on original, so we don't see any glitches
}
// credits to: https://stackoverflow.com/questions/5866169/how-to-get-all-selected-values-of-a-multiple-select-box
function getSelectValues(select) {
var result = [];
var options = select && select.options;
var opt;
for (var i=0, iLen=options.length; i<iLen; i++) {
opt = options[i];
if (opt.selected) {
result.push(opt.value || opt.text);
}
}
return result;
}
答案 1 :(得分:1)
我有其他案例&#34; copy&#34;命令不起作用。 ExecCommand返回true,但未复制该值。在我的情况下,问题是执行命令的函数(确切地说是Promise)。也许是一个小样本(使用Zomry的答案):
function copyToClipboardButtonHandler_Working() {
//copy logic executed directly here works
showpropval('this works');
}
function copyToClipboardButtonHandler_NotWorking() {
//copy logic executed directly here works
myService.doSomeLogicAndReturnPromiseWithAString().then(text =>
showpropval(text) /*this does NOT work'*/
);
}
如果我正确解释,必须在人类调用的相同脚本执行迭代中调用命令。由于Promise的回调是在其他迭代中,浏览器否认它(虽然它说它没有)。我不知道这是否属实,但代码对我有用,这很好;)
答案 2 :(得分:1)
这是一个例子:
function copyUserName() {
//just_for_copy is my invisible extra field
document.getElementById('just_for_copy').value = document.getElementById('user_phone').value;
var justForCopy = document.getElementById('just_for_copy');
justForCopy.select();
document.execCommand("copy");
}
答案 3 :(得分:1)
function CopyToClipboard(element) {
var $temp = $("<input>");
$("body").append($temp);
$temp.val($(element).text()).select();
document.execCommand("copy", false, $temp.val());
$temp.remove();
}
答案 4 :(得分:0)
没有直接关系,但似乎是个好地方。使用document.execCommand()时,用于提供“文本”的元素必须在页面上可见。所以使用display:none;尝试使元素高度:0;也会导致失败。宽度:0;也会破坏此功能。我解决了这个问题,但是将元素定位为绝对并将其移离屏幕很远。
希望这对某人有帮助:-)
答案 5 :(得分:0)
在 2021 年,当与 Internet Explorer 的兼容性最终(几乎)变得无关紧要时,最简单的解决方案是:
function copyToClipboard(value) {
navigator.clipboard.writeText(value)
}
答案 6 :(得分:-1)
试试这个:
function showpropval(val) {
var temp = val;
document.execCommand("copy",false,val);
}