Angular 5 - 复制到剪贴板

Sam*_*one 80 typescript angular angular5

我正在尝试实现一个图标,单击该图标会将变量保存到用户的剪贴板.我目前已经尝试了几个库,但没有一个能够这样做.如何在Angular 5中将变量正确复制到用户的剪贴板?

提前致谢

San*_*ile 156

解决方案1:复制任何文本

HTML

<button (click)="copyMessage('This goes to Clipboard')" value="click to copy" >Copy this</button>
Run Code Online (Sandbox Code Playgroud)

.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);
  }
Run Code Online (Sandbox Code Playgroud)

解决方案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>
Run Code Online (Sandbox Code Playgroud)

.ts文件

    /* To copy Text from Textbox */
  copyInputMessage(inputElement){
    inputElement.select();
    document.execCommand('copy');
    inputElement.setSelectionRange(0, 0);
  }
Run Code Online (Sandbox Code Playgroud)

在这里演示


解决方案3:导入第三方指令ngx-clipboard

<button class="btn btn-default" type="button" ngxClipboard [cbContent]="Text to be copied">copy</button>
Run Code Online (Sandbox Code Playgroud)

  • @SangramNandkhile 我检查了一遍又一遍,但仍然是同样的错误。这是我的代码 `&lt;input *ngIf="invitation_code" type="text" readonly value="{{invitation_code}}" #userinput &gt; &lt;button *ngIf="code_success" (click)="copyInputMessage(userinput)" 值="点击复制"&gt;复制代码&lt;/按钮&gt;`谢谢 (2认同)
  • 你永远不应该直接以角度访问 DOM。确保以正确的方式[注入文档](/sf/ask/2626490891/)! (2认同)

Dan*_*aru 49

我知道这已经在这里被高度投票了,但我宁愿选择自定义指令方法并依赖于@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);
  }
}
Run Code Online (Sandbox Code Playgroud)

然后使用它

<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`);
}
Run Code Online (Sandbox Code Playgroud)

注意:注意window["clipboardData"]IE是必需的,因为它不明白e.clipboardData

  • 使之成为可重用指令的荣誉。好点子! (3认同)
  • 事实上,从版本 12.x 开始,Safari 再次出现问题:) (2认同)
  • 最小的解决方法是创建一个范围并将该范围添加到选择中,工作解决方案如下所示 https://stackblitz.com/edit/angular-labs-copy-clipboard-r1 (2认同)

小智 40

我认为复制文本时这是一个更清洁的解决方案:

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

然后在html中的click事件上调用copyToClipboard.(点击)= "copyToClipboard( 'texttocopy')"

  • 而且removelistener也不起作用,因为原始监听器需要作为参数传递 (6认同)
  • 由于未定义 e.clipboardData,因此在 IE 上不起作用。 (2认同)
  • 在这里查看如何让删除事件侦听器工作:/sf/answers/3629078911/ (2认同)

Nab*_*bel 28

从 Angular Material v9 开始,它现在有一个剪贴板 CDK

剪贴板 | 角材料

它可以像这样简单地使用

<button [cdkCopyToClipboard]="This goes to Clipboard">Copy this</button>
Run Code Online (Sandbox Code Playgroud)

  • 可从 Angular Material v9 获取。 (3认同)
  • 是的,只需安装 `ng add @angular/cdk` 并在您的 `app.module.ts` 中添加 `import { ClipboardModule } from '@angular/cdk/clipboard'` 并将其添加到您的模块导入中: `imports: [ ...,剪贴板模块]`。 (2认同)

小智 10

您可以使用 Angular 模块来实现这一点:

navigator.clipboard.writeText('your text').then().catch(e => console.error(e));
Run Code Online (Sandbox Code Playgroud)


Cha*_*san 10

使用 angular cdk 复制,

模块.ts

import {ClipboardModule} from '@angular/cdk/clipboard';
Run Code Online (Sandbox Code Playgroud)

以编程方式复制一个字符串:MyComponent.ts,

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

  copyHeroName() {
    this.clipboard.copy('Alphonso');
  }
}
Run Code Online (Sandbox Code Playgroud)

单击要通过 HTML 复制的元素:

<button [cdkCopyToClipboard]="longText" [cdkCopyToClipboardAttempts]="2">Copy text</button>
Run Code Online (Sandbox Code Playgroud)

参考:https : //material.angular.io/cdk/clipboard/overview

  • 这迫使您使用 Angular Material (3认同)
  • @edu你不一定需要安装整个```@angular/material```包,而只需要安装它的对等依赖项:```@angular/cdk``` (3认同)

Lea*_*ore 9

很简单兄弟

在 .html 文件中

<button (click)="copyMessage('This goes to Clipboard')" value="click to copy" >Copy this</button>
Run Code Online (Sandbox Code Playgroud)

在 .ts 文件中

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


Joh*_*ohn 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);
}
Run Code Online (Sandbox Code Playgroud)


Cod*_*ker 6

使用navigator.clipboard.writeText的内容复制到剪贴板

navigator.clipboard.writeText(content).then().catch(e => console.error(e));
Run Code Online (Sandbox Code Playgroud)


Gop*_*hra 5

对我来说document.execCommand('copy'),给出了已弃用的警告,并且我需要复制的数据在内部<div>作为textNode而不是<input>or <textarea>

这就是我在 Angular 7 中的做法(受到 @Anantharaman 和 @Codemaker 的回答的启发):

<div id="myDiv"> &lt &nbsp This is the text to copy. &nbsp &gt </div>
<button (click)="copyToClipboard()" class="copy-btn"></button>
Run Code Online (Sandbox Code Playgroud)
 copyToClipboard() {
    const content = (document.getElementById('myDiv') as HTMLElement).innerText;
    navigator['clipboard'].writeText(content).then().catch(e => console.error(e));

  }
}
Run Code Online (Sandbox Code Playgroud)

绝对不是最好的方法,但它达到了目的。