11548 sujets

JavaScript, DOM et API Web HTML5

Salut, je cherche a entourer une phrase sélectionner dans un champ de formulaire, un peu comme un bbcode et pour cela j'ai un champ textarea

<textarea name="message" id="message" rows="15" cols="76" tabindex="3" onselect="storeCaret(this);" onclick="storeCaret(this);" onkeyup="storeCaret(this);" class="inputbox"></textarea>


Ainsi qu'un bouton

<INPUT TYPE="BUTTON" ID="I_BTN43" NAME="I_BTN41" VALUE="TEST" title="Mets des balises ** devant et après la phrase sélectionné" onclick="Fct_Btn43(value)" >


Et un code javascript qui me permet de faire ce que je souhaite

function Insert_Tag( where_, tagdeb_, tagfin_){
  var Obj = document.getElementById( where_);
  if( Obj){
    Obj.focus();
    if(typeof Obj.selectionStart != 'undefined'){
      //-- Position du curseur
      var PosDeb = Obj.selectionStart;
      var PosFin = Obj.selectionEnd;
      //-- Recup. des Chaines
      var Chaine  = Obj.value;
      var szAvant = Chaine.substring( 0 , PosDeb);
      var szApres = Chaine.substring( PosFin, Obj.textLength );
      //-- Recup. texte selectionne
      var szSelect = Chaine.substring( PosDeb, PosFin);
      //-- Insertion des tags
      Obj.value = szAvant + tagdeb_ + szSelect + tagfin_ + szApres;
      //-- Replace le curseur
      PosDeb = szAvant.length + tagdeb_.length +szSelect.length;
      PosFin = PosDeb;
      Obj.setSelectionRange(  PosDeb, PosFin);
      //-- Replace le Focus
      Obj.focus();
    }
    else{ // IE and consort
      var Decal;
      //-- Recup. de la selection
      var Chaine   = document.selection.createRange();
      var szSelect = Chaine.text;
      Chaine.text  = tagdeb_ + szSelect + tagfin_;
      Chaine = document.selection.createRange();
      //-- Replace le curseur avant balise fin
      if( szSelect.length > 0){
        //-- Le curseur est en debut de chaine
        Decal = tagdeb_.length + szSelect.length;
        //-(*)- Supprime les retours Chariot
        Decal -= Get_NbrCR( szSelect);
      }
      else{
        //-- Le curseur est en fin de chaine
        Decal = -tagfin_.length;
      }
      //-- Deplace le curseur
      Chaine.move('character', Decal);
      Chaine.collapse();
      Chaine.select();
    }
  }
}
//-----------------------


function Fct_Btn43(value){
  var szTag ="";
  szTag = document.getElementById('I_BTN43').value;
  Insert_Tag('message', "["+ value +"]", "["+ value +"]");
}


Tous fonctionne pour ce que je veux faire ! Mais j'ai tout de même deux problèmes

1. Lorsque j'ai dépasser le nombre de ligne visible dans le champ de formulaire par exemple 5 lignes et que je fait appel au bouton après avoir sélectionner le dernier mot, le curseur revient tout en haut du champ alors que je souhaiterai qu'il reste à la fin de la chaine de caractère.

2. Je souhaiterai que le bouton ai le nom TEST et que lorsque je clic dessus c'est [**][**] qui apparait, par exemple si je sélectionne le mot essai dans l'état actuel le script générera [TEST]essai[TEST] et je voudrai [**]essai[**]

Je précise qu'un bouton X devrai afficher [**]texte[**] et un bouton Y afficherai [##]texte[##]

Voila j'espère avoir été assez explicite et merci par avance
Modifié par kilian67 (21 May 2009 - 12:20)
Bonjour,

Tu as écrit ce script JS toi-même, ou bien tu l'as récupéré?

Les modifications que tu demandes sont substantielles et demanderaient une réécriture partielle ou totale de ce script. Si tu l'as écris toi-même, tu es sans doute en mesure de l'améliorer ou de tenter certaines modifications, puis éventuellement de demander de l'aide sur les modifications qui te posent problème ou des pistes de travail (je rappelle brièvement qu'une règle du forum dit: «ceci est une communauté d'entraide, pas de travail à votre place» Smiley cligne ).

Si c'est un script récupéré et que tu ne maitrises pas... j'aurais tendance à te conseiller de rechercher un script plus élaboré qui correspond mieux à tes besoins. Je pense par exemple au plugin markItUp pour jQuery.
Florent V. a écrit :
Tu as écrit ce script JS toi-même, ou bien tu l'as récupéré?


Salut, et merci pour cette réponse, j'ai récupérer le script et c'est bien pour cela que je demande de l'aide !

Florent V. a écrit :
Les modifications que tu demandes sont substantielles et demanderaient une réécriture partielle ou totale de ce script.


Je me doute que la modification est surement substantiel mais je n'y connais pas grand chose en javascript

Florent V. a écrit :
«ceci est une communauté d'entraide, pas de travail à votre place»


Je ne demande pas de faire du travail à ma place mais comme je l'ai dit je n'y connais pas grand choses en javascript

Florent V. a écrit :
Je pense par exemple au plugin markItUp pour jQuery.


J'ai déjà trouver une source en jQuery qui fonctionne très bien mais je n'arrive pas à l'adapter a ce que je veux faire !
kilian67 a écrit :
Je ne demande pas de faire du travail à ma place mais comme je l'ai dit je n'y connais pas grand choses en javascript

Hmm... c'est un peu antinomique tout ça. «Je n'y connais pas grand chose, voilà un code que j'ai récupéré et que je ne comprends pas (ou mal), voici ce que je veux faire, je ne demande pas à ce qu'on fasse le travail à ma place mais aidez-moi.» Euh oui, très bien, mais qu'est-ce qu'on peut faire au juste à part te suggérer de te plonger dans l'apprentissage des bases de JavaScript?

Mon conseil serait donc:

1. D'utiliser markItUp, qui est un plugin bien fichu et qui propose pas mal de possibilités d'adaptation, et devrait permettre d'obtenir ce que tu souhaites.
2. De lire une introduction à JavaScript si les bases du langage (syntaxe, objets...) ne sont pas connues.
3. De lire les cours et tutoriels d'introduction à jQuery.
4. De lire la documentation de markItUp, et de faire des essais.
Bon et bien puisque je ne peux pas avoir d'aide ici et bien j'irai en chercher ailleurs, si le fait de trouver une source qui as été mis à disposition du public et de vouloir l'utiliser est mal et bien je ne voit pas comment faire.

Pour info pour sont qui en ont besoin voila la source en jQuery qui fonctionne très bien sur une page seule mais que une fois mis en place la ou je le souhaite ne fonctionne plus, j'y ai laisser le nom de l'auteur Daniel Hagnoul afin de respecter sont travail Smiley cligne

<!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" xml:lang="fr">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="Author" content="Daniel Hagnoul" />
    <title>Page type</title>
    <style type="text/css">
        body {
            background-color:#696969;
            color:#000000;
            font-family:Arial, Helvetica, 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 type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.js"></script>
    <script type="text/javascript">
        $.fn.textAreaSelectedText = function() {
            //Author : Daniel Hagnoul, 16 mai 2009. v1.0.0
            //Modified 18 mai 2009 [bug in Internet Explorer] v1.1.0
            //Modified 19 mai 2009 [use range.parentElement()] v1.2.0
            
            var s = ""; //renvoie une chaine vide par défaut
            
            if (arguments.length != 0) return s;
        
            if (this[0].tagName == "TEXTAREA") {
                //on est maintenant certain que this[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 (this[0].selectionStart != "undefined") {
                    //Firefox
                    
                    //Firefox renvoie toujours une valeur, même si la sélection n'est pas dans this !
                    var startPos = this[0].selectionStart;
                    var endPos = this[0].selectionEnd;
                    
                    //si les valeurs sont égales la sélection n'est pas dans le textarea !
                    if (startPos != endPos) {
                        s = this.val().substring(startPos, endPos);
                    }                    
                }
            }
            
            return s;
        }
 
        $.fn.textAreaTagSelectedText = function(startTag, endTag, moveCursor) {
            //Author : Daniel Hagnoul, 16 mai 2009. v1.0.0
            //Modified 18 mai 2009 [bug in Internet Explorer] v1.1.0
            //Modified 19 mai 2009 [use range.parentElement()] v1.2.0
                        
            var s = ""; //renvoie une chaine vide par défaut
            
            if (arguments.length != 3) return s;
            
            for (var i = 0; i < arguments.length; ++i) {
                if (arguments[i] == "undefined") return s;
            }
        
            if (this[0].tagName == "TEXTAREA") {
                //on est maintenant certain que this[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
                                this.select();                        
                                range = document.selection.createRange();
                                var pos = this.val().length;
                                range.moveStart('character', pos);
                                range.collapse();
                                range.select();
                            }
                        }
                    }
                    
                } else if (this[0].selectionStart != "undefined") {
                    //Firefox
                    
                    //Firefox renvoie toujours une valeur, même si la sélection n'est pas dans this !
                    var startPos = this[0].selectionStart;
                    var endPos = this[0].selectionEnd;
                    
                    //si les valeurs sont égales la sélection n'est pas dans le textarea !
                    if (startPos != endPos) {
                        s = this.val().slice(startPos, endPos);
                        
                        if ((startTag.length > 0) && (endTag.length > 0)) {
                            var scrollValue = this.scrollTop();
                            var debut = this.val().slice(0, startPos);
                            var fin = this.val().slice(endPos);
                        
                            this.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;
                                this[0].selectionStart = pos;
                                this[0].selectionEnd = pos;
                                this.scrollTop(scrollValue);
                                this.focus();
                            } else if (moveCursor == true) {
                                //le curseur va à la fin du texte
                                this.select();
                                var pos = this.val().length;
                                this[0].selectionStart = pos;
                                this[0].selectionEnd = pos;                            
                                this.scrollTop(this.height());
                                this.focus();
                            }
                        }
                    }                    
                }
            }
            
            return s;
        }
        
        $(document).ready(function(){
        
            $(".ajoutBalise").click(function(){
                
                //var s = $("#textArea").textAreaSelectedText();
                
                //var s = $("#textArea").textAreaTagSelectedText($(this).attr("startTag"), $(this).attr("endTag"), true);
                
                $("#textArea").textAreaTagSelectedText($(this).attr("startTag"), $(this).attr("endTag"), false);
                
                return false;
            });
            
        });
    </script>
</head>
<body>
    <div id="conteneur">
        <p>Un texte sélectionable pour test</p>
        <div style="margin:12px;">
            <textarea id="textArea" 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>


Néanmoins merci d'avoir pris du temps a me répondre que les forums alsacreations sont la uniquement pour les gens qu'y s'y connaissent vraiment et que pour les autres ils ont cas apprendre. Smiley biggol

Tous ce que je demandai c'est de l'aide pour que le curseur reste a sa place une fois la balise en place.

D'ailleurs il y le même problème sur votre forum et je trouve cela plutôt gênant de devoir descendre la scroll barre a chaque utilisation d'un bbcode mais ce n'est qu'un avis personnel Smiley cligne [/i]
kilian67 a écrit :
Bon et bien puisque je ne peux pas avoir d'aide ici et bien j'irai en chercher ailleurs

Smiley lol Au non reste avec nous! il va bientôt y avoir les promos de l'été une réponse moins cher que gratuite pour deux questions.

Le problème c'est que c'est un problème plus complexe qu'il n'y parait et c'est pour ça que si tu utilise jQuery alors markItUp c'est une super solution!

Ta solution est incomplète dans certain cas tu vas avoir des problèmes avec Explorer.
matmat a écrit :
Smiley lol Au non reste avec nous! il va bientôt y avoir les promos de l'été une réponse moins cher que gratuite pour deux questions.


T'inquiète je sais bien que vous avez peu a perdre avec moi.

Vous me parlez tous de markItUp mais ce serai bien de donner un petit lien ou donner de l'information ou alors c'est encore trop demander !? Smiley lol et oui je sais GOOGLE est mon ami, mais peu être as-tu un lien intéressant.

D'autre forum m'ont mieux accueilli pour la même question et franchement d'avoir ce genre de réponses ça ne donne pas envie de rester, c'est comme si tu allais au restaurant et tu demande le plat du jour et pour réponse ont te dit c'est écris sur le tableau à l'entrée donc si vous voulez savoir lever vous, mais bon au moins il aurai dit ou trouver l'information.

Aller soyons sérieux si vous souhaitez que je boycotte alsacréations dite le de suite je ne vais pas en mourir ..... et vous non plus Smiley smokin
kilian67 a écrit :
c'est comme si tu allais au restaurant et tu demande le plat du jour et pour réponse ont te dit c'est écris sur le tableau à l'entrée donc si vous voulez savoir lever vous

Non. Les employés du restaurant, c'est leur boulot de guider les clients potentiels. Ici, tu as affaire à des bénévoles qui donnent une partie de leur temps. Ce n'est pas comparable.

Ensuite, dans une communauté de bénévoles, il y a toujours une philosophie générale ou des règles. Notre philosophie générale est de ne pas donner en réponse un code que le demandeur n'est pas en mesure de comprendre. D'où les rappels réguliers au fait que l'apprentissage des bases de JavaScript est indispensable si on veut pouvoir utiliser correctement un script JS, voire le modifier.

Pour markItUp, le nom seul suffit à trouver le code et la documentation. J'ai aussi évoqué les tutoriels de base de jQuery, qui peuvent être trouvés ici: http://docs.jquery.com/Tutorials
Là encore, une recherche élémentaire sur le premier moteur venu permet de trouver le site de jQuery (jquery.com). Ce dernier est plutôt bien organisé avec un menu à onglets, qui contient un onglet «Documentation».

L'essentiel est donc d'avoir le réflexe de chercher par soi-même. Quand on sait quoi chercher, ce n'est pas insurmontable.

kilian67 a écrit :
Aller soyons sérieux si vous souhaitez que je boycotte alsacréations dite le de suite

Ce n'est pas le cas.

Je pense t'avoir apporté une aide correcte. Tu as souligné deux problèmes, malgré mes connaissances toutes relatives en JavaScript j'ai pu constaté que le code actuel ne gère pas ces deux problèmes, et je t'ai proposé d'utiliser markItUp qui les gère.

À toi de voir si cette réponse te convient.

kilian67 a écrit :
les forums alsacreations sont la uniquement pour les gens qu'y s'y connaissent vraiment et que pour les autres ils ont cas apprendre

Les forums sont là pour ceux qui s'y connaissent et pour ceux qui sont en cours d'apprentissage. Ils ne sont pas destinés à ceux qui ne comptent pas apprendre, et qui attendent qu'on leur trouve une solution.

Je tiens à souligner que la plupart des problèmes posés sur ce forum ne se résolvent pas avec un «rajoute cette ligne de code, et tout marchera comme par magie». En général, un problème posé sur ce forum demande, pour recevoir une solution, a) des compétences et b) des heures de recherches et de travail. C'est le cas de ton problème car, même s'il existe des scripts de qualité qui peuvent répondre à ton problème (markItUp, le script de Daniel Hagnoul, d'autres encore...), mettre en place ce type de script demande des compétences minimales en JavaScript, des recherches dans la documentation du script choisi, et des essais pour personnaliser le script pour l'usage visé.

J'ose enfin rappeler que l'édition de site web demande des compétences professionnelles, qu'on peut acquérir en amateur ou autodidacte mais uniquement en y consacrant beaucoup de temps. Si on n'a pas de temps à consacrer à un tel apprentissage, la solution évidente est de faire appel à un professionnel qui, lui, a déjà fait cet investissement.
Modifié par Florent V. (21 May 2009 - 21:52)
Florent V. a écrit :
Ici, tu as affaire à des bénévoles qui donnent une partie de leur temps


Oui et je remercie tous ces bénévoles pour leurs travail.

Bon je vais tenter d'utiliser ce que tu me dit.

Je n'ai rien contre de me former au javascript car je sais qu'il y énorméméent de possibilités avec ce language mais je ne sais pas par ou commencer et les sites que j'ai visiter jusqu'a maintenant ne m'ont pas paru facile à comprendre.
kilian67 a écrit :
Je n'ai rien contre de me former au javascript car je sais qu'il y énorméméent de possibilités avec ce language mais je ne sais pas par ou commencer et les sites que j'ai visiter jusqu'a maintenant ne m'ont pas paru facile à comprendre.

Là c'est pas faux, les bonnes références pour l'apprentissage de JavaScript ne sont pas légion et se perdent au milieu d'innombrables sites qui proposent des scripts «DHTML» un peu kikoolol.

J'avais posé quelques questions à ce sujet, les réponses sont toujours d'actualité:
http://forum.alsacreations.com/topic-5-20818-1.html

Depuis, il y a aussi le Opera Web Standards Curriculum:
http://www.opera.com/company/education/curriculum/
Les articles sur JavaScript sont de très bonne facture et partent du tout début! Le seul problème ici c'est que ces ressources sont en anglais.

Bon courage, c'est pas toujours évident à saisir au début mais même une compréhension partielle du sujet permet de bien s'en sortir lorsqu'il s'agit de réutiliser et adapter (dans une certaine mesure) des scripts existants.
Merci pour ces infos et je vais m'y pencher dessus ..... enfin quand j'aurai un peu de temps car j'ai beaucoup de choses à faire et de projets pour mon site.

Le javascript permets de grande chose et m'a déjà été utile notamment pour des vérifications de formulaires ... et oui j'ai déjà adapté un petit script, mais celui la était assez simple je l'avoue.

Excusez moi pour mes écarts mais quand quelques chose ne fonctionne pas comme on veux rapidement tous le monde à un jour péter un plomb Smiley biggol

Avant de poster j'avais essayer de combiner les 2 codes que j'ai donner dans mes précédents posts en tentant de comprendre ce qui manquait mais sans résultats.

Il faut je pense créer une fonction spécialement pour ce que je souhaite faire et je vais bien y arriver, en tous cas il le faudra bien Smiley sweatdrop
Salut,

Je continue a penser que markItUp peux être une bonne solution, néanmoins si cela t'intéresses j'avais coder une fonction qui permet d'insérer du bbcode. Le curseur se place au début de la sélection ce qui est effectivement agréable pour l'utilisateur :

function pasteCode(txtarea, open, close){

   txtarea.focus();
   var selTop = txtarea.scrollTop;

   if (window.ActiveXObject){

      var range = txtarea.createTextRange();
      var docRange = document.selection.createRange();  
      range.moveToBookmark(docRange.getBookmark());
      var theSelection = docRange.text;

      if(close) docRange.text = open + theSelection + close;
      else docRange.text = open;
		
      range.moveStart('character', open.length);
      range.collapse();
      range.select();

   }else{
	
      var selLength = txtarea.value.length;
      var selStart = txtarea.selectionStart;
      var selEnd = txtarea.selectionEnd;
    
      var s1 = (txtarea.value).substring(0,selStart);
      var s2 = (txtarea.value).substring(selStart, selEnd)
      var s3 = (txtarea.value).substring(selEnd, selLength);

      if(close) txtarea.value = s1 + open + s2 + close + s3;
      else txtarea.value = s1 + open + s3;
    
      setSelStart = selStart + open.length;
      txtarea.setSelectionRange(setSelStart, setSelStart);
	  
  }
  
  txtarea.scrollTop = selTop;
  txtarea.focus();
  return;
    
}


C'est très simple a utiliser, pas besoin de bibliothèque tu fais juste :

pasteCode(textArea, '[before]', '[/after]');


C'est vrai que sur ce forum le script d'insertion de balises a un fonctionnement étrange Smiley biggol , rajouter la positionnement du curseur et le scrolltop, ça ne serait pas un luxe!
kilian67 a écrit :
je souhaiterai qu'il reste à la fin de la chaine de caractère.


Pour cela il faudra que tu rajoutes le nombre de caractères de ta chaîne à la position de ton curseur en modifiant les deux lignes suivantes :

Pour ie
range.moveStart('character', open.length);

par
range.moveStart('character', open.length+theSelection.length);


Pour les autres
setSelStart = selStart + open.length;

par
setSelStart = selStart + open.length + s2.length;


Ensuite dans ton bouton tu mets :
<INPUT TYPE="BUTTON" ID="I_BTN43" NAME="I_BTN41" VALUE="TEST" title="Mets des balises ** devant et après la phrase sélectionné" onclick="pasteCode(document.getElementById('message'),'[**]','[/**]')" >

Modifié par matmat (22 May 2009 - 19:41)