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);
}