IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Fonction pour un retour � la ligne auto ?


Sujet :

JavaScript

  1. #1
    Membre actif
    Homme Profil pro
    Futur d�veloppeur, �tudiant
    Inscrit en
    Juillet 2012
    Messages
    67
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 26
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activit� : Futur d�veloppeur, �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 67
    Par d�faut Fonction pour un retour � la ligne auto ?
    Bonjour,

    J'aurais besoins d'une petite fonctions pour faire un retour � la ligne automatique dans ma TextArea.

    Plus pr�cis�ment, je voudrais que si une des ligne a une largeur sup�rieure � 16 caract�res, que �a d�tecte o� se situe le dernier espace (pour ne pas couper les mots en deux) et que �a mette un retour � la ligne � la place de cet espace. Le tout si possible sans changer la position du curseur dans la TextArea, ce qui n'est pas le cas du code que j'avais essay� :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    function ralAuto(input){
      var lines = input.value.split(String.fromCharCode(13));
      for(var i = 0;i < lines.length;i++){
        var vi = reverse(lines[i]);
        var n = vi.indexOf(" ");
        if (vi.length > 16){
          vi = vi.replaceAt(n,String.fromCharCode(13));
          lines[i] = reverse(vi);
        }
        if(i === 0){
          input.value = lines[0];
        }else{
          input.value += lines[i];
        }
      }
    }
     
    //Reverse function :
    function reverse(s) {
      var o = '';
      for (var i = s.length - 1; i >= 0; i--)
        o += s[i];
      return o;
    }
     
    //replaceAt function :
    String.prototype.replaceAt=function(index, character) {
        return this.substr(0, index) + character + this.substr(index+character.length);
    };
    En gros, il split le contenu de mon input (ici ma textarea) et met chaque ligne dans un array.
    Ensuite, pour chaque ligne, il la met � l'envers et cherche la position du premier espace (le dernier quand on est � l'endroit).
    Si la longueur est sup�rieure � 16 caract�res, on remplace le caract�re la position de l'espace par un retour � la ligne.
    Puis on remet les lignes dans la textarea.

    Ce code marche pour la premi�re ligne de ma textarea, puis met un retour � la ligne apr�s chaque caract�re (il faut savoir que cette fonction est ex�cut�e par l'event onInput de ma textarea, donc la fonction ne doit si possible pas bouger le curseur pour ne pas g�ner l'�criture).

    Merci d'avance,
    Paul

  2. #2
    Membre chevronn�
    Avatar de Darkaurora
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Mai 2010
    Messages
    382
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 382
    Billets dans le blog
    1
    Par d�faut
    Un premier �l�ment de r�ponse ici: https://jsfiddle.net/90se4m66/3/

    Ta principale erreur est l'utilisation du charCode 13 au lieu de 10, cependant le code ci dessus n'a �t� test� que sur chrome il sera n�cessaire de le tester sur IE par exemple car je suis presque certains qu'il demandera une adaptation.

    Ton algo n'�tait pas mal cependant tu as fait une erreur lorsque tu remplaces l'espace � une position donn�e puis que tu r�injectes une cha�ne scind�e par un line breaks dans ton tableau.

    Donc la diff�rence majeur se trouve ici:

    Code javascript : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    vi = vi.replaceAt(n, String.fromCharCode(10));
    [].splice.apply(lines, [i, 1].concat(reverse(vi.split(String.fromCharCode(10)))));

    Sur la deuxi�me instruction je sp�cifie que je souhaite supprimer la chaine � l'indice i et le remplacer par les �l�ments du tableau retourn�s vi.split(String.fromCharCode(10))Pour information (ne sachant pas si tu es coutumier) j'utilise l'a m�thode apply afin de passer une liste d'arguments via un tableau, bien pratique dans ce cas (cf ici pour la doc).

    Edit: la correction fournis ne g�re pas si l'utilisateur a lui m�me fait un retour � la ligne!

  3. #3
    Expert confirm�
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 61
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : Urbaniste
    Secteur : Sant�

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par d�faut
    Sorry mais je ne vois pas l'utilit�

    un simple attribut wrap sur le textarea et c'est fait

    http://www.w3schools.com/tags/att_textarea_wrap.asp

    A+JYT

  4. #4
    Membre chevronn�
    Avatar de Darkaurora
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Mai 2010
    Messages
    382
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 382
    Billets dans le blog
    1
    Par d�faut
    Tout � fait d'accord avec toi sekaijin, cependant je n'ai pas essay� de pr�sumer sur l'utilit� du script j'ai seulement r�pondu � la consigne

  5. #5
    Membre actif
    Homme Profil pro
    Futur d�veloppeur, �tudiant
    Inscrit en
    Juillet 2012
    Messages
    67
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 26
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activit� : Futur d�veloppeur, �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 67
    Par d�faut
    Salut et merci pour vos r�ponses.

    Je ne peut pas utiliser l'attribut wrap parce que ma textarea a dans son css
    Donc l'attribut cols ne prends plus effet.

    EDIT: C'est tr�s bien, il ne faut pas qu'elle prennent en compte les retours � la ligne de l'utilisateur. Merci beaucoup.

    EDIT2 : Hola y a un probl�me : quand les lignes font + de 16 caract�res mais qu'il n'y a pas d'espaces �a bug compl�tement. Si il n'y a pas d'espaces, vi.indexOf(" ") serait �gal � null ?

  6. #6
    Membre chevronn�
    Avatar de Darkaurora
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Mai 2010
    Messages
    382
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 382
    Billets dans le blog
    1
    Par d�faut
    Il suffit simplement de faire une c�sure automatique si indexOf retourne -1:

    Code javascript : S�lectionner tout - Visualiser dans une fen�tre � part
    vi = vi.replaceAt(n === -1 ? 0 : n, String.fromCharCode(10));

    https://jsfiddle.net/90se4m66/4/

  7. #7
    Membre actif
    Homme Profil pro
    Futur d�veloppeur, �tudiant
    Inscrit en
    Juillet 2012
    Messages
    67
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 26
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activit� : Futur d�veloppeur, �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 67
    Par d�faut
    Euhm �a marche bien sauf qu'au lieu d'un replaceAt il faudrait ins�rer un retour � la ligne, pour �viter de supprimer la derni�re lettre du long mot.
    Je n'ai pas pu apporter un correctif moi-m�me car j'ai du mal avec la formulation (n === -1 ? 0 : n)...

    EDIT : J'ai r�ussi mais sans me passer d'un if, si tu as une id�e pour optimiser ce code :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    if (n === -1){
          vi = vi.substr(0, vi.length - 16) + String.fromCharCode(10) + vi.substr(vi.length - 16, vi.length);
    }else{
          vi = vi.replaceAt(n, String.fromCharCode(10));
    }

Discussions similaires

  1. [RegEx] Expression r�guli�re pour les retours de lignes
    Par Marshall_Mathers dans le forum Langage
    R�ponses: 3
    Dernier message: 01/03/2007, 09h42
  2. Retour � la ligne auto
    Par bardhamu dans le forum Balisage (X)HTML et validation W3C
    R�ponses: 9
    Dernier message: 03/10/2006, 14h02
  3. [SQL] Fonction split et retour � la ligne
    Par trihanhcie dans le forum PHP & Base de donn�es
    R�ponses: 8
    Dernier message: 23/06/2006, 15h42
  4. [FORUM][GENERALITES] Retour � la ligne auto
    Par kleomas dans le forum Mode d'emploi & aide aux nouveaux
    R�ponses: 3
    Dernier message: 26/12/2005, 18h29
  5. retour � la ligne auto dans un b�te tableau
    Par junty dans le forum Balisage (X)HTML et validation W3C
    R�ponses: 8
    Dernier message: 13/10/2005, 17h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo