Je veux obtenir uniquement des valeurs positives, y a-t-il un moyen de l'empêcher d'utiliser uniquement du HTML
Veuillez ne pas suggérer de méthode de validation
Utilisez le min
attribut comme ceci:
<input type="number" min="0">
Je n'étais pas satisfait de @ Abhrabm answer car:
Cela empêchait seulement les nombres négatifs d'être entrés à partir des flèches haut/bas, alors que l'utilisateur pouvait taper un nombre négatif à partir du clavier.
La solution est d’empêcher avec le code clé :
// Select your input element.
var number = document.getElementById('number');
// Listen for input event on numInput.
number.onkeydown = function(e) {
if(!((e.keyCode > 95 && e.keyCode < 106)
|| (e.keyCode > 47 && e.keyCode < 58)
|| e.keyCode == 8)) {
return false;
}
}
<form action="" method="post">
<input type="number" id="number" min="0" />
<input type="submit" value="Click me!"/>
</form>
Clarification fournie par @ Hugh Guiney :
Quels codes de clé sont vérifiés:
Donc, ce script empêche la saisie d'une clé non valide.
Pour moi, la solution était:
<input type="number" min="0" oninput="this.value = Math.abs(this.value)">
Ce code fonctionne bien pour moi. Peux tu vérifier s'il te plaît:
<input type="number" name="test" min="0" oninput="validity.valid||(value='');">
Méthode facile:
<input min='0' type="number" onkeypress="return (event.charCode == 8 || event.charCode == 0) ? null : event.charCode >= 48 && event.charCode <= 57">
Je voulais autoriser les nombres décimaux et ne pas effacer toute l'entrée si un négatif était entré. Cela fonctionne bien dans chrome au moins:
<input type="number" min="0" onkeypress="return event.charCode != 45">
Juste pour référence: avec jQuery, vous pouvez écraser les valeurs négatives sur focusout avec le code suivant:
$(document).ready(function(){
$("body").delegate('#myInputNumber', 'focusout', function(){
if($(this).val() < 0){
$(this).val('0');
}
});
});
Ceci ne remplace pas la validation côté serveur!
La réponse @Manwal est bonne, mais j'aime le code avec moins de lignes de code pour une meilleure lisibilité. Aussi, j'aime utiliser onclick/onkeypress en HTML.
Ma solution suggérée fait la même chose: Ajouter
min="0" onkeypress="return isNumberKey(event)"
à l'entrée html et
function isNumberKey(evt){
var charCode = (evt.which) ? evt.which : event.keyCode;
return !(charCode > 31 && (charCode < 48 || charCode > 57));
}
comme une fonction javascript.
Comme dit, c'est pareil. C'est juste une préférence personnelle sur la façon de résoudre le problème.
Voici une solution angular 2:
créer une classe OnlyNumber
import {Directive, ElementRef, HostListener} from '@angular/core';
@Directive({
selector: '[OnlyNumber]'
})
export class OnlyNumber {
// 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();
}
}
}
ajoutez OnlyNumber aux déclarations dans app.module.ts et utilisez-le comme ceci n'importe où dans votre application
<input OnlyNumber="true">
vous devriez utiliser l'attribut min en entrée
<input type='number' min='0'/>
<input type="number" name="credit_days" pattern="[^\-]+"
#credit_days="ngModel" class="form-control"
placeholder="{{ 'Enter credit days' | translate }}" min="0"
[(ngModel)]="provider.credit_days"
onkeypress="return (event.charCode == 8 || event.charCode == 0 ||
event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <=
57" onpaste="return false">
oninput="this.value=(this.value < Number(this.min) || this.value > Number(this.max)) ? '' : this.value;"
Voici une solution qui a fonctionné le mieux de moi pour un champ QTY qui ne permet que des nombres.
// Only allow numbers, backspace and left/right direction on QTY input
if(!((e.keyCode > 95 && e.keyCode < 106) // numpad numbers
|| (e.keyCode > 47 && e.keyCode < 58) // numbers
|| [8, 9, 35, 36, 37, 39].indexOf(e.keyCode) >= 0 // backspace, tab, home, end, left arrow, right arrow
|| (e.keyCode == 65 && (e.ctrlKey === true || e.metaKey === true)) // Ctrl/Cmd + A
|| (e.keyCode == 67 && (e.ctrlKey === true || e.metaKey === true)) // Ctrl/Cmd + C
|| (e.keyCode == 88 && (e.ctrlKey === true || e.metaKey === true)) // Ctrl/Cmd + X
|| (e.keyCode == 86 && (e.ctrlKey === true || e.metaKey === true)) // Ctrl/Cmd + V
)) {
return false;
}
Cette solution autorise toutes les fonctionnalités du clavier, y compris le copier-coller avec le clavier. Il empêche le collage de nombres négatifs avec la souris. Cela fonctionne avec tous les navigateurs et la démo sur codepen utilise bootstrap et jQuery. Cela devrait fonctionner avec des paramètres de langue autre que l'anglais et des claviers. Si le navigateur ne prend pas en charge la capture d’événement coller (IE), il supprimera le signe négatif après la mise au point. Cette solution se comporte comme le navigateur natif devrait avec min = 0 type = nombre.
Balisage:
<form>
<input class="form-control positive-numeric-only" id="id-blah1" min="0" name="nm1" type="number" value="0" />
<input class="form-control positive-numeric-only" id="id-blah2" min="0" name="nm2" type="number" value="0" />
</form>
Javascript
$(document).ready(function() {
$("input.positive-numeric-only").on("keydown", function(e) {
var char = e.originalEvent.key.replace(/[^0-9^.^,]/, "");
if (char.length == 0 && !(e.originalEvent.ctrlKey || e.originalEvent.metaKey)) {
e.preventDefault();
}
});
$("input.positive-numeric-only").bind("paste", function(e) {
var numbers = e.originalEvent.clipboardData
.getData("text")
.replace(/[^0-9^.^,]/g, "");
e.preventDefault();
var the_val = parseFloat(numbers);
if (the_val > 0) {
$(this).val(the_val.toFixed(2));
}
});
$("input.positive-numeric-only").focusout(function(e) {
if (!isNaN(this.value) && this.value.length != 0) {
this.value = Math.abs(parseFloat(this.value)).toFixed(2);
} else {
this.value = 0;
}
});
});
Ajoutez simplement une autre façon de faire (en utilisant Angular) si vous ne voulez pas salir le code HTML avec encore plus de code:
Vous devez seulement vous abonner au champ valueChanges et définir la valeur en tant que valeur absolue (en prenant soin de ne pas émettre de nouvel événement car cela entraînera une autre valeurChange, d'où un appel récursif et déclenchera un dépassement de la taille maximale de l'appel Erreur)
HTML CODE
<form [formGroup]="myForm">
<input type="number" formControlName="myInput"/>
</form>
TypeScript CODE (Dans votre composant)
formGroup: FormGroup;
ngOnInit() {
this.myInput.valueChanges
.subscribe(() => {
this.myInput.setValue(Math.abs(this.myInput.value), {emitEvent: false});
});
}
get myInput(): AbstractControl {
return this.myForm.controls['myInput'];
}