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)
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
小智 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')"
Nab*_*bel 28
从 Angular Material v9 开始,它现在有一个剪贴板 CDK
它可以像这样简单地使用
<button [cdkCopyToClipboard]="This goes to Clipboard">Copy this</button>
Run Code Online (Sandbox Code Playgroud)
小智 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
很简单兄弟
在 .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)
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)
使用navigator.clipboard.writeText的内容复制到剪贴板
navigator.clipboard.writeText(content).then().catch(e => console.error(e));
Run Code Online (Sandbox Code Playgroud)
对我来说document.execCommand('copy'),给出了已弃用的警告,并且我需要复制的数据在内部<div>作为textNode而不是<input>or <textarea>。
这就是我在 Angular 7 中的做法(受到 @Anantharaman 和 @Codemaker 的回答的启发):
<div id="myDiv"> <   This is the text to copy.   > </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)
绝对不是最好的方法,但它达到了目的。
| 归档时间: |
|
| 查看次数: |
58994 次 |
| 最近记录: |