J'utilise le suivi direct et je ne détecte pas le copier-coller avec les clés à l'intérieur de l'entrée, quelqu'un sait-il comment? Je vous remercie!
export class OnlyNumberDirective {
// Allow decimal numbers. The \, is only allowed once to occur
private regex: RegExp = new RegExp(/[0-9]+(\,[0-9]{0,1}){0,1}$/g);
// Allow key codes for special events. Reflect :
// Backspace, tab, end, home
private specialKeys: Array<string> = [ 'Backspace', 'Tab', 'End', 'Home', 'Delete', 'Del', 'Ctrl', 'ArrowLeft', 'ArrowRight', 'Left', 'Right' ];
constructor(private el: ElementRef) {
}
@HostListener('keydown', [ '$event' ])
onKeyDown(event: KeyboardEvent): string {
// Allow Backspace, tab, end, and home keys
if (this.specialKeys.indexOf(event.key) !== -1) {
return null;
}
// Do not use event.keycode this is deprecated.
// See: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
let current: string = this.el.nativeElement.value;
// We need this because the current value on the DOM element
// is not yet updated with the value from this event
let next: string = current.concat(event.key);
if (next && !String(next).match(this.regex)) {
event.preventDefault();
return null;
} else {
return next;
}
}
}
Vous pouvez simplement faire qui: pour plus d'informations ce code gère tous les utilisateurs mac qui utilisent CMD au lieu de ctrl
@HostListener('window:keydown',['$event'])
onKeyPress($event: KeyboardEvent) {
if(($event.ctrlKey || $event.metaKey) && $event.keyCode == 67)
console.log('CTRL + C');
if(($event.ctrlKey || $event.metaKey) && $event.keyCode == 86)
console.log('CTRL + V');
}
Si vous souhaitez détecter un autre type de raccourci:
--- MISE À JOUR APRÈS COMMENTAIRE ---
Vous pouvez faire quelque chose comme ça
ngOnInit() {
this.bindKeypressEvent().subscribe(($event: KeyboardEvent) => this.onKeyPress($event));
}
onKeyPress($event: KeyboardEvent) {
if(($event.ctrlKey || $event.metaKey) && $event.keyCode == 67)
console.log('CTRL + C');
if(($event.ctrlKey || $event.metaKey) && $event.keyCode == 86)
console.log('CTRL + V');
}
private bindKeypressEvent(): Observable<KeyboardEvent> {
const eventsType$ = [
fromEvent(window, 'keypress'),
fromEvent(window, 'keydown')
];
// we merge all kind of event as one observable.
return merge(...eventsType$)
.pipe(
// We prevent multiple next by wait 10ms before to next value.
debounce(() => timer(10)),
// We map answer to KeyboardEvent, TypeScript strong typing...
map(state => (state as KeyboardEvent))
);
}
ou si ne fonctionne pas, juste:
private bindKeypress(): Observable<KeyboardEvent> {
const typeOfEvent = this.deviceService.getKeybordEvent();
fromEvent(window, typeOfEvent)
.pipe(
// We map answer to KeyboardEvent, TypeScript strong typing...
map(state => (state as KeyboardEvent))
);
}
Où this.deviceService.getKeybordEvent();
est la méthode qui renvoie le type de base d'événement sur l'agent utilisateur. la liste massive de l'agent utilisateur peut être trouvée ici
Angular fournit une API de haut niveau pour écouter les combinaisons de touches. Consultez l'exemple suivant.
ctrl-keys.directive.ts
import { Directive, Output, EventEmitter, HostListener } from '@angular/core';
@Directive({
selector: '[ctrlKeys]',
})
export class CtrlKeysDirective {
@Output() ctrlV = new EventEmitter();
@Output() ctrlC = new EventEmitter();
@HostListener('keydown.control.v') onCtrlV() {
this.ctrlV.emit();
}
@HostListener('keydown.control.c') onCtrlC() {
this.ctrlC.emit();
}
}
Utilisation
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
template: `
<input ctrlKeys (ctrlV)="onCtrlV()" (ctrlC)="onCtrlC()" >
`,
styleUrls: ['./app.component.css']
})
export class AppComponent {
onCtrlV() {
console.log('ctrlV pressed')
}
onCtrlC() {
console.log('ctrlC pressed')
}
}
Au lieu de surveiller les événements clés pour les commandes copier-coller, je suggère de gérer les événements du presse-papiers (copy
, cut
, paste
). En plus de prendre en charge les différents raccourcis utilisés sur différentes plates-formes, il détecte également les opérations du presse-papiers lancées avec le menu contextuel. Veuillez noter que l'événement paste
peut être annulé avec e.preventDefault()
. Vous pouvez voir le code à l'œuvre dans ce stackblitz .
@HostListener('copy', ['$event'])
onCopy(e: ClipboardEvent) {
...
}
@HostListener('paste', ['$event'])
onPaste(e: ClipboardEvent) {
let clipboardData = e.clipboardData || window.clipboardData;
let pastedText = clipboardData.getData('text');
...
}
Ajoutez simplement ceci à n'importe quel composant. Lorsque l'utilisateur effectue la combinaison de touches Ctrl +s il imprimera "Enregistrer effectué"
@HostListener('document:keydown.control.s', ['$event']) onKeydownHandler(event: KeyboardEvent) {
console.log('Save Performed');
event.preventDefault();
}
Si tu veux Ctrl +v remplacez le 's' dans 'document: keydown.control.s' par 'v'.
Importez d'abord HostListener et créez une méthode pour écouter l'événement de keyup. Utilisez également ctrlKey car keycode est obsolète.
import { HostListener} from '@angular/core';
@HostListener('window:keyup', ['$event'])
keyEvent(event: KeyboardEvent) {
if (event.ctrlKey) {
if (event.key === 'c') {
console.log('ctrl c');
}
else if (event.key === 'v') {
console.log('ctrl v')
}
}