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
[WF4] PASSAGE D'ARGUMENTS LITERAL, VISUALBASICVALUE OU LAMBDAVALUE?[WF4] PASSAGE D'ARGUMENTS LITERAL, VISUALBASICVALUE OU LAMBDAVALUE? par JeremyJeanson
Avec la sortie de la RC de Visual Studio 2010, Microsoft a mis un peu les points sur leS i en ce qui concernait le passage d'arguments. Mais nous somme un certain nombre à avoir pris ce changement comme un coup dur. Pour résumer la situation : à la sortie...
Cliquez pour lire la suite de l'article par JeremyJeanson [RIA SERVICES] INCLUDE ET DOMAINDATASOURCE[RIA SERVICES] INCLUDE ET DOMAINDATASOURCE par Audrey
Dans un de mes articles précédents , j'avais parlé des DomainDataSource avec RIA Services dans le cas d'une interface Maître - Détail. Dans le même principe, je vais parler d'une autre manière de mettre en forme ce cas d'interface avec RIA Services. Et po...
Cliquez pour lire la suite de l'article par Audrey ZUNE : VERSION ZUNE SOFTWARE V 4.2 ET LA SOCIALISATIONZUNE : VERSION ZUNE SOFTWARE V 4.2 ET LA SOCIALISATION par ROMELARD Fabrice
Une des nouveautés de la version V 3.0 était l'apparition de l'onglet Social qui ne fonctionnait que si le MarketPlace était activé sur son poste. Cela limitait donc son intérêt, car hors du cadre commercial USA-CANADA, peu de monde trouva...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice PRATIQUE DE SILVERLIGHT PAR ERIC AMBROSIPRATIQUE DE SILVERLIGHT PAR ERIC AMBROSI par MPOWARE
Je viens de finir la lecture du dernier livre d'
Eric Ambrosi
éditions PEARSON
Son livre donne une approche pratique de Silverlight qui sera aussi bien comprise par le développeur que par le designeur.
Tous les aspects du développement RIA sont abor...
Cliquez pour lire la suite de l'article par MPOWARE APPRENDRE à DéVELOPPER POUR LES MOBILES AVEC LA NOUVELLE GéNéRATION .NETAPPRENDRE à DéVELOPPER POUR LES MOBILES AVEC LA NOUVELLE GéNéRATION .NET par odewit
2 déclinaisons de Silverlight et 2 déclinaisons de Mono permettent dorénavant (ou permettront prochainement) de développer des applications .NET mobiles pour les principales plates-formes du marché :
Silverlight pour Symbian, basé sur Silverlight 2...
Cliquez pour lire la suite de l'article par odewit
Logiciels
Academy System (10.9.4.0)ACADEMY SYSTEM (10.9.4.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods
|