Оновлення! 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'), що насправді не буде працювати.