Je suis vraiment nouveau en JavaScript et je voudrais ajouter à mon texte d'entrée l'insertion d'espace pour l'enregistrement d'un compte IBAN.
<input type="text" name="iban" onkeyup="if(this.value.length > 34){this.value=this.value.substr(0, 34);}" />
Il y a mon champ d'entrée; quelqu'un pourrait-il me dire comment je peux le faire?
Les réponses existantes sont relativement longues et ressemblent à une tuerie excessive. De plus, ils ne fonctionnent pas complètement (par exemple, vous ne pouvez pas modifier les caractères précédents).
Pour les intéressés, selon Wikipedia :
Les caractères IBAN autorisés sont les chiffres de 0 à 9 et les 26 caractères alphabétiques latins majuscules de A à Z.
Voici une version relativement courte semblable aux réponses existantes:
document.getElementById('iban').addEventListener('input', function (e) {
e.target.value = e.target.value.replace(/[^\dA-Z]/g, '').replace(/(.{4})/g, '$1 ').trim();
});
<label for="iban">iban</label>
<input id="iban" type="text" name="iban" />
Comme indiqué ci-dessus, le problème est que vous ne pouvez pas revenir en arrière et modifier les caractères précédents. Si vous voulez résoudre ce problème, vous devez récupérer la position actuelle du curseur en accédant initialement à la propriété selectionEnd
, puis en définissant la position du caret après que la mise en forme de l'expression rationnelle a été appliquée.
document.getElementById('iban').addEventListener('input', function (e) {
var target = e.target, position = target.selectionEnd, length = target.value.length;
target.value = target.value.replace(/[^\dA-Z]/g, '').replace(/(.{4})/g, '$1 ').trim();
target.selectionEnd = position += ((target.value.charAt(position - 1) === ' ' && target.value.charAt(length - 1) === ' ' && length !== target.value.length) ? 1 : 0);
});
<label for="iban">iban</label>
<input id="iban" type="text" name="iban" />
Vous remarquerez qu'il y a un léger problème lorsque le caractère après le curseur est un espace (car l'espace n'a pas été pris en compte lors de la récupération initiale de la position du curseur). Pour résoudre ce problème, la position est incrémentée manuellement si le caractère suivant est un espace (en supposant qu'un espace a effectivement été ajouté - ce qui est déterminé en comparant la longueur avant et après le remplacement des caractères).
En utilisant plain-JavaScript, je suggérerais:
function space(el, after) {
// defaults to a space after 4 characters:
after = after || 4;
/* removes all characters in the value that aren't a number,
or in the range from A to Z (uppercase): */
var v = el.value.replace(/[^\dA-Z]/g, ''),
/* creating the regular expression, to allow for the 'after' variable
to be used/changed: */
reg = new RegExp(".{" + after + "}","g")
el.value = v.replace(reg, function (a, b, c) {
return a + ' ';
});
}
var el = document.getElementById('iban');
el.addEventListener('keyup', function () {
space(this, 4);
});
Un peu tardivement, ma réécriture de ce qui précède pour gérer les chaînes plutôt que les nœuds DOM:
function space(str, after) {
if (!str) {
return false;
}
after = after || 4;
var v = str.replace(/[^\dA-Z]/g, ''),
reg = new RegExp(".{" + after + "}", "g");
return v.replace(reg, function (a) {
return a + ' ';
});
}
var el = document.getElementById('iban');
el.addEventListener('keyup', function () {
this.value = space(this.value, 4);
});
Références:
pour des milliers sur 4 angulaire dans un tuyau entier = entier.replace (/ [^\dA-Z]/g, '') .replace (/ (. {3})/g, '$ 1.'). trim ();
Vous devez capturer chaque groupe de 4 chiffres, puis mettre un espace entre chaque groupe.
$('input').blur(function () {
//Replace each group 4 digits with a group plus a space
var reformat = this.value.replace(/(\d{4})/g, function(match){
return match + " ";
});
this.value = reformat;
})
Et celui-ci se met à jour lors de la frappe
//Keys pressed 0 times
var downed = 0;
$('#test').keydown(function () {
downed++;
if(downed == 3){
var reformat = this.value.replace(/(\d{4}\s*)/g, function(match){
//Strip spaces
if(match.match(/\s/)){return match;}
return match + " ";
});
console.log(reformat);
this.value = reformat;
//Start recount
downed = 0;
}
});
Le code de Josh Crozie est vraiment gentil, mais pas complet.
Deux problèmes avec elle;
Le code ci-dessous est basé sur le code de Josh Crozie, avec les deux problèmes mentionnés ci-dessus corrigés et un peu plus détaillé pour des raisons de lisibilité:
var isAndroid = navigator.userAgent.indexOf("ndroid") > -1;
var element = document.getElementById('iban');
element.addEventListener('input', function () {
if (isAndroid) {
// For Android 7+ the update of the cursor location is a little bit behind, hence the little delay.
setTimeout(reformatInputField);
return;
}
reformatInputField();
});
function reformatInputField() {
function format(value) {
return value.replace(/[^\dA-Z]/gi, '')
.toUpperCase()
.replace(/(.{4})/g, '$1 ')
.trim();
}
function countSpaces(text) {
var spaces = text.match(/(\s+)/g);
return spaces ? spaces.length : 0;
}
var position = element.selectionEnd;
var previousValue = element.value;
element.value = format(element.value);
if (position !== element.value.length) {
var beforeCaret = previousValue.substr(0, position);
var countPrevious = countSpaces(beforeCaret);
var countCurrent = countSpaces(format(beforeCaret));
element.selectionEnd = position + (countCurrent - countPrevious);
}
}
<label for="iban">iban</label>
<input id="iban" type="text" name="iban" size="35" />
J'ai besoin de la même chose mais pour BVR/BVR + formulaire de paiement suisse . Donc, ce dont j'ai besoin, c'est d'ajouter un espace tous les 5 caractères mais à la fin de la chaîne .
Exemple: "52 86571 22001 00000 10520 15992" ou parfois plus court comme "843 14293 10520 15992".
Donc, voici la solution en inversant la chaîne avant et après l'ajout d'espaces si rev = 1.
function space(str, stp, rev) {
if (!str) {
return false;
}
if (rev == 1) {
str = str.split('').reverse().join('');
}
if(stp > 0) {
var v = str.replace(/[^\dA-Z]/g, ''),
reg = new RegExp(".{" + stp + "}", "g");
str = v.replace(reg, function (a) {
return a + ' ';
});
}
if (rev == 1) {
str = str.split('').reverse().join('');
}
return str;
}
Utilisation :
var refTxt = space(refNum, 5, 1);
Il s'agit de la version la plus courte utilisant JQuery pour une entrée de type number
ou tel
:
$('input[type=number], input[type=tel]').on('input', function (e) {
e.target.value = e.target.value.replace(/[^\dA-Z]/g, '').replace(/(.{4})/g, '$1 ').trim();
});
Vous pouvez également modifier le nombre de 4 pour n’importe quelle autre limite de caractères souhaitée.