更新!iOS >= 10
看起来在选择范围和一些小技巧的帮助下,可以直接复制到 iOS (>= 10) Safari 上的剪贴板。我个人在 iPhone 5C iOS 10.3.3 和 iPhone 8 iOS 11.1 上对此进行了测试。但是,似乎有一些限制,它们是:
- 文本只能从
<input>
和<textarea>
元素复制。
- 如果保存文本的元素不在a 内
<form>
,则它必须在contenteditable
.
- 包含文本的元素不能是
readonly
(尽管您可以尝试,但这不是任何地方都记录的“官方”方法)。
- 元素内的文本必须在选择范围内。
要满足所有这四个“要求”,您必须:
- 将要复制的文本放入
<input>
or<textarea>
元素中。
- 保存元素的
contenteditable
和的旧值,readonly
以便在复制后能够恢复它们。
- 更改
contenteditable
到true
和readonly
到false
。
- 创建一个范围以选择所需的元素并将其添加到窗口的选择中。
- 设置整个元素的选择范围。
- 恢复以前的
contenteditable
和readonly
值。
- 运行
execCommand('copy')
。
这将导致用户设备的插入符号移动并选择您想要的元素中的所有文本,然后自动发出复制命令。用户将看到正在选择的文本,并会显示带有选择/复制/粘贴选项的工具提示。
现在,这看起来有点复杂,只是发出复制命令太麻烦了,所以我不确定这是 Apple 的预期设计选择,但谁知道......同时,这目前有效在 iOS >= 10 上。
话虽如此,像这样的polyfill可用于简化此操作并使其跨浏览器兼容(感谢@Toskan在评论中提供链接)。
工作示例
总而言之,您需要的代码如下所示:
function iosCopyToClipboard(el) {
var oldContentEditable = el.contentEditable,
oldReadOnly = el.readOnly,
range = document.createRange();
el.contentEditable = true;
el.readOnly = false;
range.selectNodeContents(el);
var s = window.getSelection();
s.removeAllRanges();
s.addRange(range);
el.setSelectionRange(0, 999999); // A big number, to cover anything that could be inside the element.
el.contentEditable = oldContentEditable;
el.readOnly = oldReadOnly;
document.execCommand('copy');
}
请注意,el
此函数的参数必须是 an<input>
或 a <textarea>
。
旧答案:以前的 iOS 版本
在iOS < 10上,Safari(实际上是安全措施)对Clipboard API有一些限制:
- 它
copy
仅在有效选择上触发事件,cut
并且paste
仅在聚焦的可编辑字段中触发事件。
- 它仅支持通过快捷键读取/写入操作系统剪贴板,不支持通过
document.execCommand()
. 请注意,“快捷键”是指一些可点击的(例如复制/粘贴操作菜单或自定义 iOS 键盘快捷键)或物理键(例如连接的蓝牙键盘)。
- 它不支持
ClipboardEvent
构造函数。
因此(至少到目前为止)不可能使用 Javascript 以编程方式复制 iOS 设备剪贴板中的某些文本/值。只有用户可以决定是否复制某些内容。
然而,可以通过编程方式选择某些内容,这样用户只需点击选择中显示的“复制”工具提示。这可以使用与上面完全相同的代码来实现,只需删除execCommand('copy')
,这确实不起作用。