Bloquer la saisie d'un textarea

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

29 mai 2006, 11:53

Bonjour à tous,

Je doit bloquer la taille d'un textarea à 400 caractères.
Pour des raisons de présentations, je suis obligé de passer par une textarea.

Après quelques recherche sur le net, je suis tombé sur ce code :
http://www.wikistuce.info/doku.php/java ... _textearea
Mais il ne me convient pas parce que si je saisie du texte au milieu de ce qui est saisi, il tronque la fin du texte.

Pour parer à cette solution, j'ai modifié la fonction de cette manière

Code : Tout sélectionner

//Permet de limiter la taille du texte saisi dans un textarea function textLimit(field, maxlen) { //Si le nombre de caractères saisis est supérieur à la limite, on interdit la saisie if (field.value.length > maxlen) { return false; } return true; }
et je l'appelle de cette manière

Code : Tout sélectionner

onkeyDoxn="return textLimit(this, 400);"
Ce qui me permet de bloquer la saisie du caractère. Pas d'ajout, donc pas de troncature.

Mais, puisqu'il en faut un, cette solution ne me déplait pas parce qu'une fois la limite atteinte, toutes les touches sont désactivées, y compris "Del" et CTRL+x

Est-ce que quelqu'un à une astuce ou une solution à mon problème ?

Merci d'avance
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

29 mai 2006, 12:21

Je n'ai pas la solution exacte en tête, mais j'ajouterais un test
pour n'interdire que les caractères (lettres, chiffres, symboles)
et non les touches de fonction ("Suppr",...)

Il te faudrait récupérer le dernier caractère saisi dans la variable frappe
que tu passes en paramètre dans ta fonction.
function textLimit(field, maxlen, frappe)
{ // Si le nombre de caractères saisis est supérieur à la limite, on interdit la saisie
  if ((field.value.length > maxlen) && (frappe.charCodeAt(0) > 41) && (frappe.charCodeAt(0) <176))
// 177 correspond à la touche "Suppr"
     { return false;
     }
  return true;
}
Si tu sais jouer avec les RegExp, ce peut être une autre solution...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

29 mai 2006, 12:35

Le problème, c'est que ce textarea doit recevoir des templates HTML et qu'il peut contenir plus que les caractère alphanum

Mais je vais me renseigner sur la récupération de la dernière touche.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 377 Messages

29 mai 2006, 12:59

et si au lieu de déclencher sur le onkeydown tu déclenchais au onkeyup? au moins la dernière touche serait prise en compte
Enfin je sais pas trop, moi j'dis ça j'dis rien lol
Petit scarabée deviendra grand

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

29 mai 2006, 13:01

C'est aussi une idée qui m'a traversée l'esprit mais le problème c'est que le return false sur un onkeyUp n'a aucun effet. Je peut continuer à tapper du texte :(
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 377 Messages

29 mai 2006, 13:03

et onkeypress? (quoique je pense que c'est idem à onkeydown)
Petit scarabée deviendra grand

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

29 mai 2006, 13:05

tout a Fait, le onKeyPress est pour une touche qui reste appuyée. J'ai essayé, l'un, l'autre, les deux, mais toujours pareil
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

29 mai 2006, 13:07

Autre possibilité, qui implique davantage l'utilisateur :
Lorsque la chaîne saisie dépasse la longueur maximale autorisée,
la chaîne (ou le fond) change de couleur et passe en rouge.

Cela avertit l'utilisateur que sa saisie sera tronquée à l'enregistrement.
Charge à lui de réduire sa prose dans les limites admises.
S'il revient en deça de la longueur maximale, la couleur redevient normale. ;)

Plus intéressant encore :
Tu peux aussi faire disparaître le bouton submit quand le maximum est dépassé
et le faire réapparaître quand la longueur redevient licite. =D>

Avantage de cette solution : l'utilisateur peut toujours tripatouiller sa saisie,
faire des copier/coller (s'il veut conserver ailleurs le trop saisi), etc... :pouce:

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

29 mai 2006, 13:07

Ce programme js te permettra de récupèrer les codes des touches down :

Code : Tout sélectionner

<html> <body> <script type="text/javascript"> function codekey(e) { var keynum if(window.event) // IE { keynum = e.keyCode } else if(e.which) // Netscape/Firefox/Opera { keynum = e.which } alert (keynum); } </script> <form> <input type="text" onkeydown="codekey(event)" /> </form> </html>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

29 mai 2006, 13:07

le problème du onKeyUp, c'est que la touche aura déjà été préssé, donc le return false arrive trop tard... la solution est peut être de passer event en parametre de ta fonction, de récupérer le code de la touche et d'ignorer ceux des delete, suppr, fleches, etc.

Eléphant du PHP | 377 Messages

29 mai 2006, 13:11

peut etre quelque chose de ce genre:

Code : Tout sélectionner

function textLimit(field, maxlen) { // Si le nombre de caractères saisis est supérieur à la limite, on coupe if (field.value.length > maxlen) { field.value=field.value.substr(0,maxlen); } }
et

Code : Tout sélectionner

onkeyup="textLimit(this,400);"
Petit scarabée deviendra grand

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

29 mai 2006, 13:15

Mais il ne me convient pas parce que si je saisie du texte au milieu de ce qui est saisi, il tronque la fin du texte.
[-X ;)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

29 mai 2006, 13:39

Je suis en pause actuellement mais dès que mon boss est revenu, je lui parle de la zone rouge.

En ce qui concerne l'anihilation de l'action de DEL, après réflexion, je me demande si c'est pas le meilleur moyen d'oublier des touches qui sont nécessaires :-k
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

29 mai 2006, 13:45

La "zone rouge" enrichie d'une activation/désactivation est une solution que j'affectionne beaucoup.

Elle évite en outre de perdre trop de temps à essayer d'identifier les touches autorisées sans en oublier...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

29 mai 2006, 13:50

Effectivement, elle me plait beaucoup.

En tout cas merci à Sadeq et à Shrell pour leurs idées. Mais ne vous éloignez pas trop, je risque d'avoir encore besoin de vous :langue:
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer