[angular] Angular 5-클립 보드에 복사

클릭하면 사용자의 클립 보드에 변수를 저장하는 아이콘을 구현하려고합니다. 나는 현재 여러 라이브러리를 시도했지만 그중 어느 것도 그렇게 할 수 없었습니다.

Angular 5에서 사용자의 클립 보드에 변수를 올바르게 복사하려면 어떻게해야합니까?



답변

해결 방법 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 : TextBox에서 복사

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의 답변 을 확인하십시오 ClipboardEvent.


답변

나는 이것이 이미 여기에서 많이 투표되었다는 것을 알고 있지만, 차라리 사용자 지정 지시문 접근 방식을 선택하고 @jockeisorby가 제안한대로 ClipboardEvent에 의존하는 동시에 리스너가 올바르게 제거되었는지 확인합니다 (동일한 기능을 제공해야 함). 이벤트 리스너 추가 및 제거)

stackblitz 데모

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


답변

텍스트를 복사 할 때 이것이 훨씬 더 깨끗한 해결책이라고 생각합니다.

copyToClipboard(item) {
    document.addEventListener('copy', (e: ClipboardEvent) => {
      e.clipboardData.setData('text/plain', (item));
      e.preventDefault();
      document.removeEventListener('copy', null);
    });
    document.execCommand('copy');
  }

그런 다음 html의 클릭 이벤트에서 copyToClipboard를 호출하십시오. (클릭) = “copyToClipboard ( ‘texttocopy’)”


답변

Angular Material v9부터는 이제 클립 보드 CDK가 있습니다.

클립 보드 | 각도 재질

다음과 같이 간단하게 사용할 수 있습니다.

<button [cdkCopyToClipboard]="This goes to Clipboard">Copy this</button>


답변

이벤트 핸들러가 제대로 제거되지 않는 문제를 해결하는 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);
}


답변

Angular 모듈을 사용하여이 작업을 수행 할 수 있습니다.

navigator.clipboard.writeText('your text').then().catch(e => console.error(e));


답변

아래 방법은 메시지 복사에 사용할 수 있습니다.

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