クリックすると変数をユーザーのクリップボードに保存するアイコンを実装しようとしています。私は現在いくつかのライブラリを試しましたが、どれもできませんでした。
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
。
Cannot read property 'select' of undefined
、angular 6 を使い続けました。これはangular6互換ですか?
<input *ngIf="invitation_code" type="text" readonly value="{{invitation_code}}" #userinput > <button *ngIf="code_success" (click)="copyInputMessage(userinput)" value="click to copy" > Copy code </button>
ありがとう
position
、left
、top
、とopacity
。そしてそれをaに置き換えますselBox.style.height = '0';
私はこれがすでにここで非常に投票されていることを知っていますが、カスタムディレクティブアプローチを採用して、@ 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);
}
document.execCommand(‘cut’/‘copy’) was denied because it was not called from inside a short running user-generated event handler
これは、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);
}
Angularでこれを行い、コードをシンプルに保つための最良の方法は、このプロジェクトを使用することです。
https://www.npmjs.com/package/ngx-clipboard
<fa-icon icon="copy" ngbTooltip="Copy to Clipboard" aria-hidden="true"
ngxClipboard [cbContent]="target value here"
(cbOnSuccess)="copied($event)"></fa-icon>
角度付き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>
最初に提案されたソリューションは機能し、変更する必要があるだけです
selBox.value = val;
に
selBox.innerText = val;
つまり、
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.innerText = val;
document.body.appendChild(selBox);
selBox.focus();
selBox.select();
document.execCommand('copy');
document.body.removeChild(selBox);
}