Оновлення! iOS> = 10
Схоже, за допомогою діапазонів виділення та деякого невеликого злому можна безпосередньо скопіювати в буфер обміну на iOS (> = 10) Safari. Я особисто тестував це на iPhone 5C iOS 10.3.3 та iPhone 8 iOS 11.1. Однак, мабуть, існують певні обмеження, які:
- Текст можна копіювати лише з
<input>
та <textarea>
елементів.
- Якщо елемент, що містить текст, не знаходиться всередині a
<form>
, тоді він повинен бути contenteditable
.
- Елемент, що містить текст, не повинен бути
readonly
(хоча ви можете спробувати, це не є "офіційним" методом, де десь зафіксовано).
- Текст всередині елемента повинен бути в діапазоні виділення.
Щоб охопити всі ці чотири "вимоги", вам доведеться:
- Помістіть текст для копіювання всередину елемента
<input>
або <textarea>
елемента.
- Збережіть старі значення елемента
contenteditable
та readonly
елемента, щоб мати можливість відновити їх після копіювання.
- Змініть
contenteditable
на true
та readonly
на false
.
- Створіть діапазон, щоб вибрати потрібний елемент і додати його до виділеного вікна.
- Встановіть діапазон вибору для всього елемента.
- Відновити попереднє
contenteditable
та readonly
значення.
- Біжи
execCommand('copy')
.
Це призведе до переміщення каретки пристрою користувача та виділення всього тексту в потрібному елементі, а потім автоматично видасть команду копіювання. Користувач побачить виділений текст, а також з’явиться підказка з опціями вибору / копіювання / вставки.
Зараз це виглядає трохи складно і занадто складно клопотати, щоб просто виконати команду копіювання, тому я не впевнений, що це був задуманий вибір дизайну від Apple, але хто знає ... тим часом це наразі працює на iOS> = 10 .
При цьому сказав, polyfills як цей можна було б використовувати , щоб спростити цю дію і зробити його крос-браузер , сумісний (спасибі @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);
el.contentEditable = oldContentEditable;
el.readOnly = oldReadOnly;
document.execCommand('copy');
}
Зверніть увагу, що el
параметром цієї функції має бути <input>
або a<textarea>
.
Стара відповідь: попередні версії iOS
У iOS <10 для Safari (які насправді є заходами безпеки) існують деякі обмеження щодо API буфера обміну :
- Він запускає
copy
події лише за дійсним виділенням cut
і paste
лише у сфокусованих редагованих полях.
- Він підтримує лише читання / запис з буфера обміну ОС за допомогою клавіш швидкого доступу, а не через
document.execCommand()
. Зверніть увагу, що "клавіша скорочення" означає якусь клацану (наприклад, меню дій копіювання / вставлення або спеціальний ярлик клавіатури iOS) або фізичну клавішу (наприклад, підключену клавіатуру Bluetooth).
- Він не підтримує
ClipboardEvent
конструктор.
Тож (принаймні на сьогоднішній день) неможливо програмно скопіювати якийсь текст / значення в буфер обміну на пристрої iOS за допомогою Javascript . Тільки користувач може вирішити, чи копіювати щось.
Однак можливо вибрати щось програмно , так що користувач повинен лише натиснути підказку "Копіювати", показану на виділенні. Цього можна досягти за допомогою того самого коду, що і вище, просто видаливши execCommand('copy')
, що насправді не буде працювати.