Accueil > > > TEXTAREA : LIMITER LA LARGEUR ET LA HAUTEUR DU TEXTE SAISIE
TEXTAREA : LIMITER LA LARGEUR ET LA HAUTEUR DU TEXTE SAISIE
Information sur la source
Description
La plupart des contrôles de saisie dans un champ textarea se limite à la longueur du texte. L'intérêt de limiter la largeur et la hauteur peut être simplement cosmétique (je rappèle que l'attribut wrap est à proscrire) : pas de barre de défilement (sauf si vous avez joué avec la feuille de style :-) ). Il peut aussi s'agir de fournir des données à un vieux programme (genre Cobol) qui veut absolument tant de lignes et tant de colonnes et qui ne plante pas proprement sinon. Syntaxe : - memoire(nom_du_textarea); - texte_limite(nom_du_textarea, largeur_max, hauteur_max); Le principe est simple : 1. À l'appui d'une touche, on mémorise le contenu actuel du champ. Si on a un copier/coller un peu gros, cela permettra de revenir en arrière. 2. Au relachement de la touche on regarde si le nombre de caractères ne dépasse pas la largeur x la hauteur. Si c'est la cas on arrête tout en pleurant. 3. On compte les lignes en trop. S'il y en a, on les regroupe au début. 4. On vérifie la longueur de chaque ligne une à une. Si ça dépasse, on coupe et on reporte à la ligne suivante. 5. S'il y a eu modification des lignes, on refait une passe (retour au point 2.)
Source
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml" lang="fr">
- <head>
- <title>Ne pas dépasser 80 x 6</title>
- <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
- <script type="text/javascript">
- function memoire(champ)
- {
- avant = champ.value;
- }
-
- function texte_limite(champ, largeur, hauteur)
- {
- probleme = false;
- apres = champ.value;
- lignes = apres.split(/[\n\r]/);
- // trop de caractères ?
- if (lignes.join('').length > (largeur-1)*hauteur) {
- //alert('largeur x hauteur = '+largeur*hauteur+'\nnombre de lignes : '+lignes.length+'\nnombre de caractères : '+lignes.join('').length);
- champ.value = avant; // marche arrière
- alert('Texte trop long !');
- } else {
- entrop = lignes.length-hauteur;
- // trop de lignes ?
- if (entrop > 0) {
- probleme = true;
- //a=lignes[0];
- detrop = lignes.splice(0,entrop);
- //b=lignes[0];
- lignes[0] = detrop.join(' ')+' '+lignes[0];
- //alert(entrop+' ligne(s) en trop\nligne 1 avant : '+a+'\nligne 1 apres decalage : '+b+'\nnouvelle ligne 1 : '+lignes[0]);
- }
- // ligne(s) trop longue(s) ?
- apartir = Math.min(lignes.length, hauteur);
- for (i = 0 ; i < apartir ; i++)
- {
- entrop = lignes[i].length-largeur;
- if (entrop > 0) {
- probleme = true;
- //a=lignes[i];
- //c=lignes[i+1];
- /*
- coupure = lignes[i].lastIndexOf(' ');
- if (coupure == -1) {
- */
- //b=lignes[i].substr(largeur);
- if (i+1 == apartir) {
- lignes[i+1] = lignes[i].substr(largeur);
- } else {
- lignes[i+1] = lignes[i].substr(largeur)+' '+lignes[i+1];
- }
- lignes[i] = lignes[i].substr(0, largeur);
- /*
- } else {
- //b=lignes[i].substr(coupure+1);
- if (i+1 == apartir) {
- lignes[i+1] = lignes[i].substr(coupure+1);
- } else {
- lignes[i+1] = lignes[i].substr(coupure+1)+' '+lignes[i+1];
- }
- lignes[i] = lignes[i].substr(0, coupure);
- }
- */
- //alert('largeur : '+largeur+' et coupure : '+coupure+'\n'+entrop+' caractère(s) en trop ligne '+(i+1)+'\nligne : '+a+'\npartie en trop : '+b+'\nligne suivante : '+c+'\nnouvelle ligne : '+lignes[i]+'\nnouvelle ligne suivante : '+lignes[i+1]);
- }
- }
- if (probleme) {
- champ.value = lignes.join('\n'); // concaténation
- texte_limite(champ, largeur, hauteur); // nouvelle passe
- }
- }
- }
- </script>
- </head>
- <body>
- <form id="test" method="post" action="#">
- <textarea id="texte" name="texte" cols="80" rows="6" style="overflow: auto;" onkeypress="memoire(this);" onkeyup="texte_limite(this, 80, 6);"></textarea>
- <br />
- <input type="submit" value="Zou" />
- </form>
- </body>
- </html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr">
<head>
<title>Ne pas dépasser 80 x 6</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<script type="text/javascript">
function memoire(champ)
{
avant = champ.value;
}
function texte_limite(champ, largeur, hauteur)
{
probleme = false;
apres = champ.value;
lignes = apres.split(/[\n\r]/);
// trop de caractères ?
if (lignes.join('').length > (largeur-1)*hauteur) {
//alert('largeur x hauteur = '+largeur*hauteur+'\nnombre de lignes : '+lignes.length+'\nnombre de caractères : '+lignes.join('').length);
champ.value = avant; // marche arrière
alert('Texte trop long !');
} else {
entrop = lignes.length-hauteur;
// trop de lignes ?
if (entrop > 0) {
probleme = true;
//a=lignes[0];
detrop = lignes.splice(0,entrop);
//b=lignes[0];
lignes[0] = detrop.join(' ')+' '+lignes[0];
//alert(entrop+' ligne(s) en trop\nligne 1 avant : '+a+'\nligne 1 apres decalage : '+b+'\nnouvelle ligne 1 : '+lignes[0]);
}
// ligne(s) trop longue(s) ?
apartir = Math.min(lignes.length, hauteur);
for (i = 0 ; i < apartir ; i++)
{
entrop = lignes[i].length-largeur;
if (entrop > 0) {
probleme = true;
//a=lignes[i];
//c=lignes[i+1];
/*
coupure = lignes[i].lastIndexOf(' ');
if (coupure == -1) {
*/
//b=lignes[i].substr(largeur);
if (i+1 == apartir) {
lignes[i+1] = lignes[i].substr(largeur);
} else {
lignes[i+1] = lignes[i].substr(largeur)+' '+lignes[i+1];
}
lignes[i] = lignes[i].substr(0, largeur);
/*
} else {
//b=lignes[i].substr(coupure+1);
if (i+1 == apartir) {
lignes[i+1] = lignes[i].substr(coupure+1);
} else {
lignes[i+1] = lignes[i].substr(coupure+1)+' '+lignes[i+1];
}
lignes[i] = lignes[i].substr(0, coupure);
}
*/
//alert('largeur : '+largeur+' et coupure : '+coupure+'\n'+entrop+' caractère(s) en trop ligne '+(i+1)+'\nligne : '+a+'\npartie en trop : '+b+'\nligne suivante : '+c+'\nnouvelle ligne : '+lignes[i]+'\nnouvelle ligne suivante : '+lignes[i+1]);
}
}
if (probleme) {
champ.value = lignes.join('\n'); // concaténation
texte_limite(champ, largeur, hauteur); // nouvelle passe
}
}
}
</script>
</head>
<body>
<form id="test" method="post" action="#">
<textarea id="texte" name="texte" cols="80" rows="6" style="overflow: auto;" onkeypress="memoire(this);" onkeyup="texte_limite(this, 80, 6);"></textarea>
<br />
<input type="submit" value="Zou" />
</form>
</body>
</html>
Conclusion
Parmi les modifications possibles (en option par exemple), on peut vouloir : - Faire une double passe (de bas en haut puis de haut en bas) pour retailler les lignes au mieux, - Faire du filtrage des espaces en double ou en début de ligne, - Couper au dernier espace de la ligne pour éviter de tronquer les mots : elle est actuellement commentée (partie utilisant la variable coupure) car il est possible d'avoir une boucle infinie dans certains cas. Le test se fait sur le nombre de caractères mais avec une découpe par mots, il est parfois impossible d'arranger le texte pour qu'il tienne dans le nombre de lignes imparties. - Ne contrôler que la taille des lignes (nombre de colonnes), à coupler avec l'option précédente dans ce cas. - etc.
Historique
- 19 février 2009 10:44:47 :
- J'ai corrigé l'erreur concernant le 'undefined'. Il s'agissait en fait de la ligne suivante, lorsqu'elle n'existait pas encore (c'est-à-dire lignes[i+1] est undefined). J'ai donc ajouté un test (voir if (i+1 == apartir)) pour ne récupérer la ligne suivante que si elle existe !
J'en ai profité pour améliorer le source : il est maintenant récursif. Si la dernière ligne dépasse la largeur maximale, on refait une passe complète.
Enfin, j'ai laissé des lignes en commentaire. Ce sont les variables a, b, c et la boite d'alerte : En les décommentant, les curieux pourront voir comment la fonction agit sur les lignes.
- 19 février 2009 16:06:41 :
- J'ai été un peu vite en besogne : quelques petites corrections pour avoir un javascript stable.
- 25 février 2009 12:36:33 :
- Version définitive et totalement stable.
- 25 février 2009 12:38:16 :
- Version définitive et robuste.
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Formulaire avec tableau auto dimensionné selon la taille de la fenetre [ par julien71 ]
Je dois faire un tableau qui se redimensionne selon la taille de la fenetre.Les données sont stockées dans un tableau qui contient des enregistrements
Formulaire : Ajouter une ligne sans reload [ par coraziari ]
Bonjour,Je réalise un formulaire de saisie de CV mais je galère un peu pour les expériences. En effet, pour ne pas "polluer" trop la page, j'ai mis un
passage de tableau vers php [ par sapakus ]
Voili voilà,Je souhaite envoyer le contenu d'une variable javascript à une page PHP. J'utilise pour ce faire la technique du champ cach
valeurs de formulaire 'select' dynamique [ par DarkTiteuf ]
Voila bonsoir j'ai le cas suivant : et je voudrais que lorsque je clique sur une valeur a gauche cela change le tableau de droite. La propriét&
enregistrer formulaire dans cookie [ par chabichowed ]
Bonjour,Le script ci dessous permet de memoriser dans un cookie les valeur d un formulaire. le truc c est qu il ne retient que les textfield.Je l ai e
formulaire et TextArea [ par beku ]
Bonjour à tous je voudrais savoir comment effacer le contenu d'un textarea quand on clicke sur un bouton radio ? En effet, textarea n'a pas d'attribut
textarea [ par Tieum86 ]
Bonjour,j'ai un petit problème de conception avec mon site web.Je suis novice en javascript (mon domaine est plutot le langage API siemens...) et je v
Afficher un exemple dans un tableau en fonction d'un choix dans un formulaire [ par kilian67 ]
Bonjour,Je souhaite que d'après les choix qu'un utilisateur fait dans un formulaire de mise en page (police, taille, couleur, etc...) un exemple s'aff
controle formulaire + textarea [ par cowlili ]
Bonjour,j'ai un problème: je n'arrive pas à faire un contrôle pour vérifier si les textarea de mon formulaire ne sont pas vide. J'ai essayé de la faço
textarea et lecture/remplacement d'une ligne [ par rangdalf ]
Bonjour,Dans ma page HTML, j'ai 2 boutons:Un qui ajoute dynamiquement des lignes à un tableau avec un texte saisie et un bouton supprimer.Un autre qui
|
Derniers Blogs
[WP7] DYNAMICALLY CHANGE STARTUP PAGE[WP7] DYNAMICALLY CHANGE STARTUP PAGE par KooKiz
Let's say that you want to allow the user to customize the startup page of your application. You can easily change the startup page by editing the 'NavigationPage' attribute in the manifest file. But the manifest cannot be modified once the applicatio...
Cliquez pour lire la suite de l'article par KooKiz SESSION SILVERLIGHT 5 3D : SLIDES ET DEMOSSESSION SILVERLIGHT 5 3D : SLIDES ET DEMOS par Groc
Durant les techdays, j'ai eu le plaisir d'animer une session sur Silverlight 5 et la 3D avec Simon Ferquel. Comme promis, voici nos slides et mes démos (celles avec le viper BSG) ici et là. Pour mémoire, les démos utilisent toutes le viper BSG...
Cliquez pour lire la suite de l'article par Groc [TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES par gpommier
Suite à la session que j'ai présenté sur WebMatrix 2, vous pouvez trouver les slides ici, ainsi que les démos en packages nuget : démos1 et démos2 J'en profite pour remercier chaleureusement tous ceux qui sont venus très nombreux à cette sess...
Cliquez pour lire la suite de l'article par gpommier [SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning
|