Comment puis-je empêcher la saisie de caractères spéciaux dans un champ de saisie avec jquery?
Un exemple simple utilisant une expression régulière que vous pouvez modifier pour autoriser/interdire ce que vous voulez.
$('input').on('keypress', function (event) {
var regex = new RegExp("^[a-zA-Z0-9]+$");
var key = String.fromCharCode(!event.charCode ? event.which : event.charCode);
if (!regex.test(key)) {
event.preventDefault();
return false;
}
});
Réponse courte: empêcher l'événement 'pression au clavier':
$("input").keypress(function(e){
var charCode = !e.charCode ? e.which : e.charCode;
if(/* Test for special character */ )
e.preventDefault();
})
Réponse longue: Utilisez un plugin tel que jquery.alphanum
Il y a plusieurs choses à considérer lors du choix d'une solution:
Je pense que cette zone est suffisamment complexe pour justifier l’utilisation d’un plugin tiers. J’ai essayé plusieurs des plugins disponibles, mais j’ai rencontré quelques problèmes avec chacun d’entre eux, j’ai donc décidé d’écrire jquery.alphanum . Le code ressemble à ceci:
$("input").alphanum();
Ou pour un contrôle plus fin, ajoutez quelques paramètres:
$("#username").alphanum({
allow : "€$£",
disallow : "xyz",
allowUpper : false
});
J'espère que ça aide.
Je recherchais une réponse qui limitait la saisie aux seuls caractères alphanumériques, mais permettait toujours l'utilisation de caractères de contrôle (par exemple, retour arrière, suppression, tabulation) et copier-coller. Aucune des réponses fournies que j'ai essayées ne répondait à toutes ces exigences, aussi ai-je proposé ce qui suit en utilisant l'événement input
.
$('input').on('input', function() {
$(this).val($(this).val().replace(/[^a-z0-9]/gi, ''));
});
Modifier:
Comme le souligne rinogo dans les commentaires, le fragment de code ci-dessus force le curseur à la fin de la saisie lors de la saisie au milieu du texte saisi. Je crois que l'extrait de code ci-dessous résout ce problème.
$('input').on('input', function() {
var c = this.selectionStart,
r = /[^a-z0-9]/gi,
v = $(this).val();
if(r.test(v)) {
$(this).val(v.replace(r, ''));
c--;
}
this.setSelectionRange(c, c);
});
Utilisez l'attribut d'entrée de modèle de HTML5!
<input type="text" pattern="^[a-zA-Z0-9]+$" />
Utilisez regex pour autoriser/interdire quoi que ce soit. En outre, pour une version légèrement plus robuste que la réponse acceptée, il est possible d’autoriser les caractères auxquels aucune valeur de clé n’est associée (retour arrière, touche de tabulation, touches fléchées, suppression, etc.) vérifiez la clé en fonction du code clé au lieu de la valeur.
$('#input').bind('keydown', function (event) {
switch (event.keyCode) {
case 8: // Backspace
case 9: // Tab
case 13: // Enter
case 37: // Left
case 38: // Up
case 39: // Right
case 40: // Down
break;
default:
var regex = new RegExp("^[a-zA-Z0-9.,/ $@()]+$");
var key = event.key;
if (!regex.test(key)) {
event.preventDefault();
return false;
}
break;
}
});
Jetez un coup d'oeil au plugin jQuery alphanumeric. https://github.com/KevinSheedy/jquery.alphanum
//All of these are from their demo page
//only numbers and alpha characters
$('.sample1').alphanumeric();
//only numeric
$('.sample4').numeric();
//only numeric and the .
$('.sample5').numeric({allow:"."});
//all alphanumeric except the . 1 and a
$('.sample6').alphanumeric({ichars:'.1a'});
Votre zone de texte:
<input type="text" id="name">
Votre javascript:
$("#name").keypress(function(event) {
var character = String.fromCharCode(event.keyCode);
return isValid(character);
});
function isValid(str) {
return !/[~`!@#$%\^&*()+=\-\[\]\\';,/{}|\\":<>\?]/g.test(str);
}
Ecrivez du code javascript sur l'événement onkeypress de la zone de texte
function isNumberKeyWithStar(evt) {
var charCode = (evt.which) ? evt.which : event.keyCode
if (charCode > 31 && (charCode < 48 || charCode > 57) && charCode != 42)
return false;
return true;
}
function isNumberKey(evt) {
var charCode = (evt.which) ? evt.which : event.keyCode
if (charCode > 31 && (charCode < 48 || charCode > 57))
return false;
return true;
}
function isNumberKeyForAmount(evt) {
var charCode = (evt.which) ? evt.which : event.keyCode
if (charCode > 31 && (charCode < 48 || charCode > 57) && charCode != 46)
return false;
return true;
}
J'utilise ce code pour modifier les autres que j'ai vus. Si vous appuyez sur la touche ou que vous collez du texte, le test de mise en correspondance (correspondance) est correct (cet exemple correspond à une saisie de texte n'autorisant que 8 chiffres)
$("input").on("keypress paste", function(e){
var c = this.selectionStart, v = $(this).val();
if (e.type == "keypress")
var key = String.fromCharCode(!e.charCode ? e.which : e.charCode)
else
var key = e.originalEvent.clipboardData.getData('Text')
var val = v.substr(0, c) + key + v.substr(c, v.length)
if (!val.match(/\d{0,8}/) || val.match(/\d{0,8}/).toString() != val) {
e.preventDefault()
return false
}
})
ceci est un exemple qui empêche l'utilisateur de taper le caractère "a"
$(function() {
$('input:text').keydown(function(e) {
if(e.keyCode==65)
return false;
});
});
codes de clé ici:
http://www.expandinghead.net/keycode.html
Je voulais commenter le commentaire d'Alex sur la réponse de Dale. Pas possible (besoin de combien de "rep"? Cela n'arrivera pas très vite ... système étrange.) Donc, comme réponse:
Vous pouvez ajouter un retour arrière en ajoutant\b à la définition de regex comme ceci: [a-zA-Z0-9\b] . Vous pouvez simplement autoriser l’ensemble de la plage latine, y compris plus ou moins tout caractère "non exotique" ( contrôle également les caractères tels que le retour arrière): ^ [\ u0000-\u024F\u20AC] + $
Seul le véritable caractère Unicode en dehors du latin est le symbole de l'euro (20ac), ajoutez tout ce dont vous avez besoin.
Pour gérer également les entrées saisies via copier-coller, associez-vous simplement à l'événement "change" et vérifiez-les également - en les supprimant ou en les rayant/en donnant un message d'erreur du type "caractères non pris en charge".
if (!regex.test($j(this).val())) {
alert('your input contained not supported characters');
$j(this).val('');
return false;
}
juste les chiffres:
$ ('input.time'). keydown (fonction (e) {if (e.KeyCode> = 48 && e.keyCode <= 57) { return true;} else { return false ;}});
ou pour le temps incluant ":"
$ ('input.time'). keydown (fonction (e) {if (e.KeyCode> = 48 && e.keyCode <= 58) { return true;} else { return false ;}});
incluant également delete et backspace:
$ ('input.time'). keydown (fonction (e) {if ((e.CodeCode> = 46 && e.CodeCode <= 58) || e.CodeCode == 8) {retour vrai;} else { return false;}});
malheureusement, ne pas le faire fonctionner sur un iMac
Oui, vous pouvez le faire en utilisant jQuery en tant que:
<script>
$(document).ready(function()
{
$("#username").blur(function()
{
//remove all the class add the messagebox classes and start fading
$("#msgbox").removeClass().addClass('messagebox').text('Checking...').fadeIn("slow");
//check the username exists or not from ajax
$.post("user_availability.php",{ user_name:$(this).val() } ,function(data)
{
if(data=='empty') // if username is empty
{
$("#msgbox").fadeTo(200,0.1,function() //start fading the messagebox
{
//add message and change the class of the box and start fading
$(this).html('Empty user id is not allowed').addClass('messageboxerror').fadeTo(900,1);
});
}
else if(data=='invalid') // if special characters used in username
{
$("#msgbox").fadeTo(200,0.1,function() //start fading the messagebox
{
//add message and change the class of the box and start fading
$(this).html('Sorry, only letters (a-z), numbers (0-9), and periods (.) are allowed.').addClass('messageboxerror').fadeTo(900,1);
});
}
else if(data=='no') // if username not avaiable
{
$("#msgbox").fadeTo(200,0.1,function() //start fading the messagebox
{
//add message and change the class of the box and start fading
$(this).html('User id already exists').addClass('messageboxerror').fadeTo(900,1);
});
}
else
{
$("#msgbox").fadeTo(200,0.1,function() //start fading the messagebox
{
//add message and change the class of the box and start fading
$(this).html('User id available to register').addClass('messageboxok').fadeTo(900,1);
});
}
});
});
});
</script>
<input type="text" id="username" name="username"/><span id="msgbox" style="display:none"></span>
et le script pour votre user_availability.php sera:
<?php
include'includes/config.php';
//value got from the get method
$user_name = trim($_POST['user_name']);
if($user_name == ''){
echo "empty";
}elseif(preg_match('/[\'^£$%&*()}{@#~?><>,|=_+¬-]/', $user_name)){
echo "invalid";
}else{
$select = mysql_query("SELECT user_id FROM staff");
$i=0;
//this varible contains the array of existing users
while($fetch = mysql_fetch_array($select)){
$existing_users[$i] = $fetch['user_id'];
$i++;
}
//checking weather user exists or not in $existing_users array
if (in_array($user_name, $existing_users))
{
//user name is not availble
echo "no";
}
else
{
//user name is available
echo "yes";
}
}
?>
J'ai essayé d'ajouter / et \ mais sans succès.
Vous pouvez également le faire en utilisant javascript et le code sera:
<!-- Check special characters in username start -->
<script language="javascript" type="text/javascript">
function check(e) {
var keynum
var keychar
var numcheck
// For Internet Explorer
if (window.event) {
keynum = e.keyCode;
}
// For Netscape/Firefox/Opera
else if (e.which) {
keynum = e.which;
}
keychar = String.fromCharCode(keynum);
//List of special characters you want to restrict
if (keychar == "'" || keychar == "`" || keychar =="!" || keychar =="@" || keychar =="#" || keychar =="$" || keychar =="%" || keychar =="^" || keychar =="&" || keychar =="*" || keychar =="(" || keychar ==")" || keychar =="-" || keychar =="_" || keychar =="+" || keychar =="=" || keychar =="/" || keychar =="~" || keychar =="<" || keychar ==">" || keychar =="," || keychar ==";" || keychar ==":" || keychar =="|" || keychar =="?" || keychar =="{" || keychar =="}" || keychar =="[" || keychar =="]" || keychar =="¬" || keychar =="£" || keychar =='"' || keychar =="\\") {
return false;
} else {
return true;
}
}
</script>
<!-- Check special characters in username end -->
<!-- in your form -->
User id : <input type="text" id="txtname" name="txtname" onkeypress="return check(event)"/>
Restreindre les caractères spéciaux sur la touche. Voici une page de test pour les codes de clé: http://www.asquare.net/javascript/tests/KeyCode.html
var specialChars = [62,33,36,64,35,37,94,38,42,40,41];
some_element.bind("keypress", function(event) {
// prevent if in array
if($.inArray(event.which,specialChars) != -1) {
event.preventDefault();
}
});
Dans Angular, j'avais besoin d'un format de devise approprié dans mon champ de texte. Ma solution:
var angularApp = angular.module('Application', []);
...
// new angular directive
angularApp.directive('onlyNum', function() {
return function( scope, element, attrs) {
var specialChars = [62,33,36,64,35,37,94,38,42,40,41];
// prevent these special characters
element.bind("keypress", function(event) {
if($.inArray(event.which,specialChars) != -1) {
prevent( scope, event, attrs)
}
});
var allowableKeys = [8,9,37,39,46,48,49,50,51,52,53,54,55,56
,57,96,97,98,99,100,101,102,103,104,105,110,190];
element.bind("keydown", function(event) {
if($.inArray(event.which,allowableKeys) == -1) {
prevent( scope, event, attrs)
}
});
};
})
// scope.$apply makes angular aware of your changes
function prevent( scope, event, attrs) {
scope.$apply(function(){
scope.$eval(attrs.onlyNum);
event.preventDefault();
});
event.preventDefault();
}
Dans le HTML, ajoutez la directive
<input only-num type="text" maxlength="10" id="amount" placeholder="$XXXX.XX"
autocomplete="off" ng-model="vm.amount" ng-change="vm.updateRequest()">
et dans le contrôleur angulaire correspondant, je ne permets qu’il n’y ait qu’une période, convertisse le texte en nombre et ajoute le nombre arrondi sur «flou»
...
this.updateRequest = function() {
amount = $scope.amount;
if (amount != undefined) {
document.getElementById('spcf').onkeypress = function (e) {
// only allow one period in currency
if (e.keyCode === 46 && this.value.split('.').length === 2) {
return false;
}
}
// Remove "." When Last Character and round the number on blur
$("#amount").on("blur", function() {
if (this.value.charAt(this.value.length-1) == ".") {
this.value.replace(".","");
$("#amount").val(this.value);
}
var num = parseFloat(this.value);
// check for 'NaN' if its safe continue
if (!isNaN(num)) {
var num = (Math.round(parseFloat(this.value) * 100) / 100).toFixed(2);
$("#amount").val(num);
}
});
this.data.amountRequested = Math.round(parseFloat(amount) * 100) / 100;
}
...
Pour remplacer des caractères spéciaux, espacez et convertissez-les en minuscules
$(document).ready(function (){
$(document).on("keyup", "#Id", function () {
$("#Id").val($("#Id").val().replace(/[^a-z0-9\s]/gi, '').replace(/[_\s]/g, '').toLowerCase());
});
});
$(function(){
$('input').keyup(function(){
var input_val = $(this).val();
var inputRGEX = /^[a-zA-Z0-9]*$/;
var inputResult = inputRGEX.test(input_val);
if(!(inputResult))
{
this.value = this.value.replace(/[^a-z0-9\s]/gi, '');
}
});
});
[User below code to restrict special character also
$(h.txtAmount).keydown(function (event) {
if (event.shiftKey) {
event.preventDefault();
}
if (event.keyCode == 46 || event.keyCode == 8) {
}
else {
if (event.keyCode < 95) {
if (event.keyCode < 48 || event.keyCode > 57) {
event.preventDefault();
}
}
else {
if (event.keyCode < 96 || event.keyCode > 105) {
event.preventDefault();
}
}
}
});]