Angular 5 - Скопировать в буфер
Я пытаюсь реализовать значок, который при нажатии сохранит переменную в буфер обмена пользователя. В настоящее время я пробовал несколько библиотек, и ни одна из них не смогла это сделать.
Как правильно скопировать переменную в буфер обмена пользователя в Angular 5?
Ответы
Ответ 1
Решение 1. Скопируйте любой текст
HTML
<button (click)="copyMessage('This goes to Clipboard')" value="click to copy" >Copy this</button>
.ts файл
copyMessage(val: string){
const selBox = document.createElement('textarea');
selBox.style.position = 'fixed';
selBox.style.left = '0';
selBox.style.top = '0';
selBox.style.opacity = '0';
selBox.value = val;
document.body.appendChild(selBox);
selBox.focus();
selBox.select();
document.execCommand('copy');
document.body.removeChild(selBox);
}
Решение 2. Скопируйте из текстового поля
HTML
<input type="text" value="User input Text to copy" #userinput>
<button (click)="copyInputMessage(userinput)" value="click to copy" >Copy from Textbox</button>
.ts файл
/* To copy Text from Textbox */
copyInputMessage(inputElement){
inputElement.select();
document.execCommand('copy');
inputElement.setSelectionRange(0, 0);
}
Демонстрация здесь
Решение 3. Импортируйте стороннюю директиву ngx-clipboard
<button class="btn btn-default" type="button" ngxClipboard [cbContent]="Text to be copied">copy</button>
Решение 4: Пользовательская директива
Если вы предпочитаете использовать пользовательскую директиву, проверьте Dan Dohotaru answer, который представляет собой элегантное решение, реализованное с использованием ClipboardEvent
.
Ответ 2
Я знаю, что за это уже проголосовали здесь, но я бы предпочел использовать собственный подход директивы и полагаться на ClipboardEvent, как предложил @jockeisorby, и при этом убедиться, что слушатель корректно удален (должна быть предусмотрена та же функция). как для добавления, так и для удаления слушателей событий)
демонстрация стекаблиц
import { Directive, Input, Output, EventEmitter, HostListener } from "@angular/core";
@Directive({ selector: '[copy-clipboard]' })
export class CopyClipboardDirective {
@Input("copy-clipboard")
public payload: string;
@Output("copied")
public copied: EventEmitter<string> = new EventEmitter<string>();
@HostListener("click", ["$event"])
public onClick(event: MouseEvent): void {
event.preventDefault();
if (!this.payload)
return;
let listener = (e: ClipboardEvent) => {
let clipboard = e.clipboardData || window["clipboardData"];
clipboard.setData("text", this.payload.toString());
e.preventDefault();
this.copied.emit(this.payload);
};
document.addEventListener("copy", listener, false)
document.execCommand("copy");
document.removeEventListener("copy", listener, false);
}
}
а затем использовать его как таковой
<a role="button" [copy-clipboard]="'some stuff'" (copied)="notify($event)">
<i class="fa fa-clipboard"></i>
Copy
</a>
public notify(payload: string) {
// Might want to notify the user that something has been pushed to the clipboard
console.info(''${payload}' has been copied to clipboard');
}
Примечание: обратите внимание, что window["clipboardData"]
необходимо для IE, так как оно не понимает e.clipboardData
Ответ 3
Я думаю, что это намного более чистое решение при копировании текста:
copyToClipboard(item) {
document.addEventListener('copy', (e: ClipboardEvent) => {
e.clipboardData.setData('text/plain', (item));
e.preventDefault();
document.removeEventListener('copy', null);
});
document.execCommand('copy');
}
А затем просто вызовите copyToClipboard на событие click в html. (Нажмите) = "CopyToClipboard ( 'texttocopy')"
Ответ 4
Измененная версия ответа jockeisorby, исправляющая неправильное удаление обработчика событий.
copyToClipboard(item): void {
let listener = (e: ClipboardEvent) => {
e.clipboardData.setData('text/plain', (item));
e.preventDefault();
};
document.addEventListener('copy', listener);
document.execCommand('copy');
document.removeEventListener('copy', listener);
}
Ответ 5
Нижеприведенный метод может быть использован для копирования сообщения: -
export function copyTextAreaToClipBoard(message: string) {
const cleanText = message.replace(/<\/?[^>]+(>|$)/g, '');
const x = document.createElement('TEXTAREA') as HTMLTextAreaElement;
x.value = cleanText;
document.body.appendChild(x);
x.select();
document.execCommand('copy');
document.body.removeChild(x);
}