ค้นหาเว็บไซต์

ไทป์สคริปต์ - แองกูลาร์ 5 - คัดลอกไปยังคลิปบอร์ด


ฉันกำลังพยายามที่จะใช้งานไอคอนที่เมื่อคลิกแล้วจะบันทึกตัวแปรไปยังคลิปบอร์ดของผู้ใช้ ตอนนี้ฉันได้ลองใช้ไลบรารีหลายตัวแล้ว แต่ไม่มีตัวไหนที่สามารถทำได้

ฉันจะคัดลอกตัวแปรไปยังคลิปบอร์ดของผู้ใช้อย่างถูกต้องใน Angular 5 ได้อย่างไร?

คำตอบ #1

วิธีแก้ปัญหา 1: คัดลอกข้อความใดก็ได้

เอชทีเอ็มแอล

<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: คัดลอกจากกล่องข้อความ

เอชทีเอ็มแอล

 <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: คำสั่งที่กำหนดเอง

ถ้าคุณชอบใช้ directive แบบกำหนดเอง ลองดูคำตอบของ Dan Dohotaru ซึ่งเป็นวิธีแก้ปัญหาที่สวยงามที่ถูกนำไปใช้โดยใช้ ClipboardEvent


วิธีแก้ 5: Angular Material

Angular Material 9 + ผู้ใช้สามารถใช้ฟีเจอร์คลิปบอร์ดที่มีมาในตัวเพื่อคัดลอกข้อความ มีการปรับแต่งเพิ่มเติมอีกเล็กน้อยเช่น การจำกัดจำนวนครั้งในการคัดลอกข้อมูล

คำตอบ #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 ในเหตุการณ์คลิกใน html (click)="copyToClipboard('texttocopy')"

คำตอบ #4

ตั้งแต่ Angular Material v9 เป็นต้นมา ตอนนี้มี clipboard CDK แล้ว

คลิปบอร์ด | Angular Material

มันสามารถใช้ได้อย่างเรียบง่ายเหมือนกับ

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

คำตอบ #5

คัดลอกโดยใช้ Angular CDK,

Module.ts

import {ClipboardModule} from '@angular/cdk/clipboard';

คัดลอกสตริงแบบโปรแกรม: MyComponent.ts,

class MyComponent {
  constructor(private clipboard: Clipboard) {}

  copyHeroName() {
    this.clipboard.copy('Alphonso');
  }
}

คลิกองค์ประกอบเพื่อคัดลอกผ่าน HTML:

<button [cdkCopyToClipboard]="longText" [cdkCopyToClipboardAttempts]="2">Copy text</button>

อ้างอิง: https://material.angular.io/cdk/clipboard/overview

คำตอบ #6

เวอร์ชันดัดแปลงของคำตอบของ 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);
}

คำตอบ #7

คุณสามารถทำสิ่งนี้ได้โดยใช้โมดูลของ Angular:

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

คำตอบ #8

มันง่ายนะพี่ชาย

ในไฟล์ .html

<button (click)="copyMessage('This goes to Clipboard')" value="click to copy" >Copy this</button>

ในไฟล์ .ts

copyMessage(text: string) {
  navigator.clipboard.writeText(text).then().catch(e => console.log(e));
}

บทความที่เกี่ยวข้อง