Próbuję zaimplementować ikonę, która po kliknięciu zapisze zmienną w schowku użytkownika. Obecnie wypróbowałem kilka bibliotek i żadna z nich nie była w stanie tego zrobić.
Jak poprawnie skopiować zmienną do schowka użytkownika w Angular 5?
Próbuję zaimplementować ikonę, która po kliknięciu zapisze zmienną w schowku użytkownika. Obecnie wypróbowałem kilka bibliotek i żadna z nich nie była w stanie tego zrobić.
Jak poprawnie skopiować zmienną do schowka użytkownika w Angular 5?
Odpowiedzi:
Rozwiązanie 1: Skopiuj dowolny tekst
HTML
<button (click)="copyMessage('This goes to Clipboard')" value="click to copy" >Copy this</button>
plik .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);
}
Rozwiązanie 2: Skopiuj z TextBox
HTML
<input type="text" value="User input Text to copy" #userinput>
<button (click)="copyInputMessage(userinput)" value="click to copy" >Copy from Textbox</button>
plik .ts
/* To copy Text from Textbox */
copyInputMessage(inputElement){
inputElement.select();
document.execCommand('copy');
inputElement.setSelectionRange(0, 0);
}
Rozwiązanie 3: Zaimportuj dyrektywę ngx-clipboard innej firmy
<button class="btn btn-default" type="button" ngxClipboard [cbContent]="Text to be copied">copy</button>
Rozwiązanie 4: Dyrektywa niestandardowa
Jeśli wolisz, stosując dyrektywę niestandardową, Sprawdź Dan Dohotaru za odpowiedź , która jest eleganckie rozwiązanie zaimplementowane przy użyciu ClipboardEvent
.
Cannot read property 'select' of undefined
angular 6. Czy to jest zgodne z 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>
Dzięki
position
, left
, top
, i opacity
. i zamień naselBox.style.height = '0';
Wiem, że zostało to już tutaj wysoko ocenione, ale wolałbym wybrać podejście z niestandardową dyrektywą i polegać na zdarzeniu ClipboardEvent, jak sugerował @jockeisorby, jednocześnie upewniając się, że odbiornik jest poprawnie usunięty (ta sama funkcja musi być zapewniona zarówno dla detektorów dodawania, jak i usuwania zdarzeń)
demo 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 następnie użyj go jako takiego
<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`);
}
Uwaga: zwróć uwagę, że window["clipboardData"]
IE jest potrzebne, ponieważ nie rozumiee.clipboardData
Myślę, że jest to znacznie czystsze rozwiązanie podczas kopiowania tekstu:
copyToClipboard(item) {
document.addEventListener('copy', (e: ClipboardEvent) => {
e.clipboardData.setData('text/plain', (item));
e.preventDefault();
document.removeEventListener('copy', null);
});
document.execCommand('copy');
}
A następnie po prostu wywołaj zdarzenie copyToClipboard po kliknięciu w html. (click) = "copyToClipboard ('texttocopy')"
Od wersji Angular Material v9 ma teraz CDK ze schowkiem
Może być używany tak prosto, jak
<button [cdkCopyToClipboard]="This goes to Clipboard">Copy this</button>
Zmodyfikowana wersja odpowiedzi jockeisorby, która naprawia procedurę obsługi zdarzeń, która nie została poprawnie usunięta.
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
Możesz to osiągnąć za pomocą modułów Angular:
navigator.clipboard.writeText('your text').then().catch(e => console.error(e));
Do skopiowania wiadomości można użyć poniższej metody: -
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);
}
Najlepszym sposobem na zrobienie tego w Angular i zachowanie prostoty kodu jest użycie tego projektu.
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>
Skopiuj za pomocą kątowego cdk,
Module.ts
import {ClipboardModule} from '@angular/cdk/clipboard';
Programowo skopiuj ciąg: MyComponent.ts,
class MyComponent {
constructor(private clipboard: Clipboard) {}
copyHeroName() {
this.clipboard.copy('Alphonso');
}
}
Kliknij element do skopiowania za pomocą HTML:
<button [cdkCopyToClipboard]="longText" [cdkCopyToClipboardAttempts]="2">Copy text</button>
Pierwsze sugerowane rozwiązanie działa, musimy tylko zmienić
selBox.value = val;
Do
selBox.innerText = val;
to znaczy,
HTML:
<button (click)="copyMessage('This goes to Clipboard')" value="click to copy" >Copy this</button>
plik .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);
}