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

jQuery Discussion :

Position du curseur dans une zone de textarea


Sujet :

jQuery

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2009
    Messages : 115
    Par défaut Position du curseur dans une zone de textarea
    Bonjour,

    En cherchant sur le forum ainsi que sur internet, je n'ai pas vraiment trouvé réponse à ma question. Je cherche à connaitre la position du curseur dans une zone textearea qui a été "transformée" en div pour réaliser un wysiwyg.

    je cherche à faire cela pour, par exemple, insérer un élément juste à l'endroit de la position du curseur.

    Jusque là j'arrive bien à avoir la position du curseur avec les fonction suivantes :

    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
    getSelection : function() {
    			return (window.getSelection) ? window.getSelection() : document.selection;
    		},
     
    		getRange : function() {
    			var selection = this.getSelection();
     
    			if (!(selection)) {
    			    return null;
    			}
     
    			return (selection.rangeCount > 0) ? selection.getRangeAt(0) : selection.createRange();
    		},
     
    		getPos : function() {
    			var range = this.getRange();
     
    			if(!(range)) {
    				return null;
    			}
     
    			var startPos = range.startOffset;
    			var endPos = range.endOffset;
     
    			return {start : startPos, end : endPos};
    		},

    En appelant la fonction getPos(), cela me permet d'avoir un objet avec la position de départ et de fin. Et ça me retourne effectivement bien la position du curseur.

    Mais si je fais un retour à la ligne, il va me recalculer la position à partir du br (de la nouvelle ligne si vous préférez) qui est généré automatiquement.

    Du coup ca fausse tout. Lorsque je souhaite retrouver la position il va prendre la position 0 de la première ligne, aller chercher la position du curseur par rapport à ce point. Malheureusement s'il y a plusieurs retour à la ligne et que le curseur se trouvait dans une ligne différente que la première, il me donnera pas la bonne position.

    Voyez vous ce que je veux dire ?

    Merci de votre aide.
    Bien cordialement.

    PS : Si vous avez besoin de tout le code demandez, j'ai essayé de mettre que le nécessaire pour ne par vous embrouiller. Pour le moment c'est compatible principalement FF

  2. #2
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut
    Bonjour.

    Il y a déjà quelque temps, j'avais mis au point un système d'insertion de tags autour d'une sélection. Cela pourra peut-être vous servir, je l'ai remis à jour :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    <!doctype html>
    <html lang="fr">
    <head>
        <meta charset="utf-8" />
        <meta name="Author" content="Daniel Hagnoul" />
        <title>Page type</title>
        <style>
            body {
                background-color:#696969;
                color:#000000;
                font-family:sans-serif;
                font-size:medium;
                font-style:normal;
                font-weight:normal;
                line-height:normal;
                letter-spacing:normal;
            }
            div,p,h1,h2,h3,h4,h5,h6,ul,ol,dl,form,table,img {
                margin:0px;
                padding:0px;
            }
            div#conteneur {
                width:95%;
                margin:12px auto;
                padding:6px;
                background-color:#FFFFFF;
                color:#000000;
                border:1px solid #999999;
                font-size:0.8em;
            }
            .ajoutBalise { /* Cette classe est indispensable, mais elle peut être vide ! */
                margin-top:12px;
                margin-left:12px;
            }
        </style>
    	<script charset="CP-1252" src="../lib/jquery-1.4.2.min.js"></script>
        <script>
            /*
             * Daniel Hagnoul
             * Version 1.3.0 du 10 mars 2010 (2010-03-10)
             * Version 1.0.0 du 16 mai 2009 (2009-05-16)
            */
            $.dvjhTextAreaTagSelectedText = function(id, startTag, endTag, minTagLength, moveCursor) {
                var obj = $("#"+id);
                var s = ""; //renvoie une chaine vide par défaut
     
                if (arguments.length != 5) return s;
     
                for (var i = 0; i < arguments.length; ++i) {
                    if (arguments[i] == "undefined") return s;
                }
     
                if ((startTag.length < minTagLength) || (endTag.length < minTagLength)) return s;
     
                if (obj[0].tagName != "TEXTAREA") return s;
                    //on est maintenant certain que obj[0] est bien un textarea
     
                if (document.selection) {
                    //Internet Explorer
     
                    var range = document.selection.createRange();
                    s = range.text;
     
                    if (s.length > 0) {
                        var node = range.parentElement();
     
                        if (node.nodeName != "TEXTAREA") {
                            s = "";
                        } else if ((startTag.length > 0) && (endTag.length > 0)) {
                            range.text = startTag + s + endTag;
     
                            /* Ajustement de la position du curseur */
                            if (moveCursor == false) {
                                //le curseur reste a l'emplacement ou le texte a été selectionner
                                range = document.selection.createRange();
                                var pos = startTag.length + s.length + endTag.length;
                                range.moveStart('character', pos);
                                range.collapse();
                                range.select();
                            } else if (moveCursor == true) {
                                //le curseur va à la fin du texte
                                obj.select();                        
                                range = document.selection.createRange();
                                var pos = obj.val().length;
                                range.moveStart('character', pos);
                                range.collapse();
                                range.select();
                            }
                        }
                    }
     
                } else if (obj[0].selectionStart != "undefined") {
                    //Firefox
     
                    //Firefox renvoie toujours une valeur, même si la sélection n'est pas dans this !
                    var startPos = obj[0].selectionStart;
                    var endPos = obj[0].selectionEnd;
     
                    //si les valeurs sont égales la sélection n'est pas dans le textarea !
                    if (startPos != endPos) {
                        s = obj.val().slice(startPos, endPos);
     
                        if ((startTag.length > 0) && (endTag.length > 0)) {
                            var scrollValue = obj.scrollTop();
                            var debut = obj.val().slice(0, startPos);
                            var fin = obj.val().slice(endPos);
     
                            obj.val(debut + startTag + s + endTag + fin);
     
                            /* Ajustement de la position du curseur */
                            if (moveCursor == false) {
                                //le curseur reste a l'emplacement ou le texte a été selectionner
                                var pos = debut.length + startTag.length + s.length + endTag.length;
                                obj[0].selectionStart = pos;
                                obj[0].selectionEnd = pos;
                                obj.scrollTop(scrollValue);
                                obj.focus();
                            } else if (moveCursor == true) {
                                //le curseur va à la fin du texte
                                obj.select();
                                var pos = obj.val().length;
                                obj[0].selectionStart = pos;
                                obj[0].selectionEnd = pos;                            
                                obj.scrollTop(obj.height());
                                obj.focus();
                            }
                        }
                    }                    
                }
     
                return s;
            }
     
            $(function(){
                var minTagLength = 4;
     
                $(".ajoutBalise").click(function(){
                    $.dvjhTextAreaTagSelectedText("message", $(this).attr("startTag"), $(this).attr("endTag"), minTagLength, false);
     
                    return false;
                });
            });
        </script>
    </head>
    <body>
        <div id="conteneur">
            <p>Un texte sélectionable pour test</p>
            <div style="margin:12px;">
                <textarea id="message" style="width:400px; height:200px;"> La JM Corporate University est une Business School, Haute Institution de Commerce et de Management implantée au cœur de la capitale européenne, située en périphérie, à Louvain-la-Neuve, dans un parc boisé de six hectares qui lui confère un rayonnement particulier. La mission de la JMCU Business School consiste à former des Managers responsables, ouverts à la connaissance et à la découverte des autres, rapidement opérationnels, dans un monde globalisé en perpétuelle évolution. Par cette mission, la JMCU entend, par un positionnement offensif, se placer comme une Business School Européenne de Commerce et de Management combinant exigence académique, expériences professionnelles et ouverture internationale, véhiculant aux diplômés des valeurs fondées sur l’audace, l’ouverture, l’humilité et l’éthique.</textarea>
                <br />
                <button class="ajoutBalise" type="button" startTag="[**]" endTag="[++]">Test 1</button>
                <button class="ajoutBalise" type="button" startTag="[--]" endTag="[++]">Test 2</button>
                <button class="ajoutBalise" type="button" startTag="[€€]" endTag="[++]">Test 3</button>
                <input class="ajoutBalise" type="button" startTag="[$$$]" endTag="[+++]" value="Test 4" />
            </div>
        </div>
    </body>
    </html>

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2009
    Messages : 115
    Par défaut Première ébauche
    Bonjour,

    Merci de m'aider pour ce projet. Votre script m'a permis d'améliorer certain points de ma programmation et corrigé quelques bugs.

    Malgré le fait qu'il ne soit pas encore opérationnel, je publie une première version. Qui je l'espère aussi vous permettra de m'aider sur d'autres point. Et peut-être qu'il aidera quelqu'un d'autre.

    Pour le moment il n'y a rien de spectaculaire puisque ce que ce n'est encore qu'une ébauche. Mais mon objectif, dans un premier temps, est de créer un éditeur (pour un projet parallèle en même temps) qui génère une mise en forme W3C quoi que l'utilisateur fasse.


    Actuellement, il y a deux boutons : lien et strong.

    Et bonne nouvelle ces deux actions ont l'air d'être compatible avec FF et IE .

    Mais (il y a toujours un mais), il reste quelques bugs dont un que je n'arrive pas à résoudre.

    Si je créer un lien que je souhaite mettre en gras par la suite, ça ne fonctionne pas. Il n'y a rien, pas d'erreur, rien ne se passe, ... Et je ne vois vraiment pas pourquoi puisque dans la logique ça devrais fonctionner.

    Normalement, tout est prêt, il suffit de deziper (rar) le fichier sur votre serveur et c'est bon.
    Fichiers attachés Fichiers attachés

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2009
    Messages : 115
    Par défaut Version du script commenté
    Voila une version du script commenté.
    Fichiers attachés Fichiers attachés

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2009
    Messages : 115
    Par défaut
    Citation Envoyé par nicko_73 Voir le message
    Il n'y a rien, pas d'erreur, rien ne se passe, ...
    Petit correctif en faite il le met dans l'attribut "Title" ce qui pause un nouveau problème

  6. #6
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut Mauvaise version du fichier RAR ?
    Bonsoir.

    Je viens de télécharger et d'installer dans mon répertoire. J'utilise Komodo Edit, je vois bien le projet et les fichiers, mais lorsque j'ouvre "http://localhost/editor/" je n'ai qu'un simple textarea !

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2009
    Messages : 115
    Par défaut
    Citation Envoyé par danielhagnoul Voir le message
    Bonsoir.

    Je viens de télécharger et d'installer dans mon répertoire. J'utilise Komodo Edit, je vois bien le projet et les fichiers, mais lorsque j'ouvre "http://localhost/editor/" je n'ai qu'un simple textarea !
    J'ai mis un http://localhost/editor devant les url pour les scripts dans le fichier index.html, normalement ca doit fonctionner.

    C'est une erreur de ma part puisque les urls en local sont de type http://editor/ sur mon PC.

    Voilà

    Encore merci de prendre un peu de temps.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. recuperer la position du curseur dans une textbox
    Par bleuerouge dans le forum Windows Forms
    Réponses: 2
    Dernier message: 29/10/2007, 10h41
  2. [Dates] Position du curseur dans une chaîne
    Par arnaud14 dans le forum Langage
    Réponses: 4
    Dernier message: 04/10/2007, 04h32
  3. [vb]position du curseur dans une zone définie
    Par maxdwarf dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 28/02/2007, 06h54
  4. [VB6] position du curseur dans une zone texte et insertion caractere
    Par tim69000 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 05/05/2006, 09h52
  5. Obtenir la position du curseur dans une Image
    Par bastoune dans le forum Composants VCL
    Réponses: 6
    Dernier message: 14/11/2003, 21h02

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