Je voudrais m'appuyer sur la réponse donnée par @omeralper , qui à mon avis a fourni une bonne base pour une solution solide.
Ce que je propose est une version simplifiée et mise à jour avec les derniers standards du web. Il est important de noter que event.keycode a été retiré des standards du web, et que les futures mises à jour des navigateurs pourraient ne plus le supporter. Voir https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
En outre, la méthode
String.fromCharCode(e.keyCode);
ne garantit pas que le keyCode correspondant à la touche pressée par l'utilisateur correspond à la lettre attendue telle qu'elle est identifiée sur le clavier de l'utilisateur, puisque des configurations de clavier différentes donneront lieu à un keycode particulier pour des caractères différents. L'utilisation de cette méthode introduira des bogues difficiles à identifier, et peut facilement briser la fonctionnalité pour certains utilisateurs. Je propose plutôt l'utilisation de event.key, voir la documentation ici. https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key
De plus, nous voulons seulement que la sortie résultante soit une décimale valide. Cela signifie que les nombres 1, 11.2, 5000.2341234 doivent être acceptés, mais que la valeur 1.1.2 ne doit pas être acceptée.
Notez que dans ma solution, j'ai exclu les fonctions couper, copier et coller, car elles ouvrent la porte à des bogues, notamment lorsque des personnes collent du texte indésirable dans les champs associés. Cela nécessiterait un processus de nettoyage sur un gestionnaire de touches, ce qui n'est pas le sujet de ce fil de discussion.
Voici la solution que je propose.
import { Directive, ElementRef, HostListener } from '@angular/core';
@Directive({
selector: '[myNumberOnly]'
})
export class NumberOnlyDirective {
// Allow decimal numbers. The \. is only allowed once to occur
private regex: RegExp = new RegExp(/^[0-9]+(\.[0-9]*){0,1}$/g);
// Allow key codes for special events. Reflect :
// Backspace, tab, end, home
private specialKeys: Array<string> = [ 'Backspace', 'Tab', 'End', 'Home' ];
constructor(private el: ElementRef) {
}
@HostListener('keydown', [ '$event' ])
onKeyDown(event: KeyboardEvent) {
// Allow Backspace, tab, end, and home keys
if (this.specialKeys.indexOf(event.key) !== -1) {
return;
}
// 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();
}
}
}
1 votes
Pourriez-vous simplement utiliser l'attribut html ? type=number
0 votes
@inoabrian Je veux réaliser ceci sans utiliser le type de numéro.
0 votes
Cela peut vous aider : stackoverflow.com/questions/39799436/