Aktualisieren! iOS> = 10
Sieht so aus, als ob es mit Hilfe von Auswahlbereichen und ein wenig Hack möglich ist, auf iOS (> = 10) Safari direkt in die Zwischenablage zu kopieren. Ich persönlich habe dies auf iPhone 5C iOS 10.3.3 und iPhone 8 iOS 11.1 getestet. Es scheint jedoch einige Einschränkungen zu geben:
- Text kann nur von
<input>
und <textarea>
Elementen kopiert werden.
- Wenn sich das Element, das den Text enthält, nicht in a befindet
<form>
, muss es sein contenteditable
.
- Das Element, das den Text enthält, darf nicht sein
readonly
(obwohl Sie es versuchen können, ist dies keine "offizielle" Methode, die irgendwo dokumentiert ist).
- Der Text innerhalb des Elements muss sich im Auswahlbereich befinden.
Um alle vier dieser "Anforderungen" abzudecken, müssen Sie:
- Fügen Sie den zu kopierenden Text in ein
<input>
oder <textarea>
-Element ein.
- Speichern Sie die alten Werte von
contenteditable
und readonly
des Elements, um sie nach dem Kopieren wiederherstellen zu können.
- Wechseln Sie
contenteditable
zu true
und readonly
zu false
.
- Erstellen Sie einen Bereich , um das gewünschte Element auszuwählen, und fügen Sie es der Fensterauswahl hinzu.
- Stellen Sie den Auswahlbereich für das gesamte Element ein.
- Stellen Sie die vorherigen
contenteditable
und readonly
Werte wieder her.
- Ausführen
execCommand('copy')
.
Dadurch wird das Caret des Geräts des Benutzers verschoben und der gesamte Text in dem gewünschten Element ausgewählt. Anschließend wird automatisch der Kopierbefehl ausgegeben. Der Benutzer sieht den ausgewählten Text und der Tooltip mit den Optionen Auswählen / Kopieren / Einfügen wird angezeigt.
Das sieht ein bisschen kompliziert und zu umständlich aus, um nur einen Kopierbefehl auszugeben. Ich bin mir also nicht sicher, ob dies eine beabsichtigte Designentscheidung von Apple war, aber wer weiß ... in der Zwischenzeit funktioniert dies derzeit unter iOS> = 10 .
Vor diesem Hintergrund könnten Polyfills wie diese verwendet werden, um diese Aktion zu vereinfachen und browserübergreifend kompatibel zu machen (danke @Toskan für den Link in den Kommentaren).
Arbeitsbeispiel
Zusammenfassend sieht der Code, den Sie benötigen, folgendermaßen aus:
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');
}
Beachten Sie, dass der el
Parameter für diese Funktion ein <input>
oder ein sein muss <textarea>
.
Alte Antwort: frühere iOS-Versionen
Unter iOS <10 gibt es einige Einschränkungen für Safari (die eigentlich Sicherheitsmaßnahmen sind) für die Zwischenablage-API :
- Es löst
copy
Ereignisse nur für eine gültige Auswahl cut
und paste
nur in fokussierten bearbeitbaren Feldern aus.
- Es unterstützt nur das Lesen / Schreiben der OS-Zwischenablage über Tastenkombinationen, nicht über
document.execCommand()
. Beachten Sie, dass "Shorcut-Taste" eine anklickbare (z. B. Aktionsmenü zum Kopieren / Einfügen oder benutzerdefinierte iOS-Tastaturkürzel) oder physische Taste (z. B. verbundene Bluetooth-Tastatur) bedeutet.
- Der
ClipboardEvent
Konstruktor wird nicht unterstützt .
Daher ist es (zumindest ab sofort) nicht möglich, Text / Wert in der Zwischenablage auf einem iOS-Gerät mithilfe von Javascript programmgesteuert zu kopieren . Nur der Benutzer kann entscheiden, ob er etwas kopiert.
Es ist jedoch möglich, etwas programmgesteuert auszuwählen , so dass der Benutzer nur den in der Auswahl angezeigten Tooltip "Kopieren" drücken muss. Dies kann mit genau dem gleichen Code wie oben erreicht werden, indem nur der entfernt wird execCommand('copy')
, was in der Tat nicht funktionieren wird.