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 :

Conflit CodeMirror et JS wysiwyg


Sujet :

JavaScript

  1. #1
    Membre actif
    Avatar de Freedolphin
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2006
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2006
    Messages : 291
    Points : 225
    Points
    225
    Par défaut Conflit CodeMirror et JS wysiwyg
    Bonjour à tous,

    J'ai un formulaire en back-office avec un textarea dans lequel je souhaite colorer les balises html.
    J'utilise pour cela CodeMirror, mais du coup ça bloque deux autres fonctionnalités : un compteur de mots et un script wysiwyg pour afficher des boutons de mise en forme.

    Voici le code de mon formulaire avec le script de CodeMirror :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    echo "<p>Texte :</p><div class='typo'><script type=\"text/javascript\">edToolbar('texte');</script></div>";
    echo "<textarea cols='110' rows='40' name='texte' id='texte' onkeyup='Compter(this.form.texte.value, this.form)' required>$texte</textarea><br>";
    <script type="text/javascript">
      var editor = CodeMirror.fromTextArea('texte', {
        height: "800px",
        parserfile: "parsexml.js",
        stylesheet: "css/xmlcolors.css",
        path: "js/",
        continuousScanning: 500,
        lineNumbers: false
      });
    </script>
    Je me doute que le conflit vient du fait que le textarea ne sert plus comme avant, il est remplacé par un autre inclus dans une iframe.

    J'ai doute essayé de retoucher le code de l'éditeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        var div = this.wrapping = createHTMLElement("div");
        div.style.position = "relative";
        div.className = "CodeMirror-wrapping";
        div.style.width = options.width;
        div.style.height = (options.height == "dynamic") ? options.minHeight + "px" : options.height;
        // This is used by Editor.reroutePasteEvent
        var teHack = this.textareaHack = createHTMLElement("textarea");
        div.appendChild(teHack);
        teHack.style.position = "absolute";
        teHack.style.left = "-10000px";
        teHack.style.width = "10px";
        teHack.tabIndex = 100000;
        teHack.id = "texte";
        teHack.onkeyup = "Compter(this.form.texte.value, this.form)";
    Sans succès. Cela me rajoute bien l'id dans le textarea généré, mais pas le onkeyup. Quelqu'un aurait-il une petite piste ?
    Merci d'avance de vos bonnes idées.
    Le mieux n'est pas forcément l'ennemi du bien.

  2. #2
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 056
    Points : 44 578
    Points
    44 578
    Par défaut
    Bonjour,
    J'utilise pour cela CodeMirror, mais du coup ça bloque deux autres fonctionnalités : un compteur de mots et un script wysiwyg pour afficher des boutons de mise en forme.
    j'ai du mal à visualiser ce qui te pose soucis.


    Je me doute que le conflit vient du fait que le textarea ne sert plus comme avant,
    certes mais celle-ci est atteignable via l'editor crée et c'est bien son contenu qui est transmis.


    ... mais bon !

  3. #3
    Membre actif
    Avatar de Freedolphin
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2006
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2006
    Messages : 291
    Points : 225
    Points
    225
    Par défaut
    Citation Envoyé par NoSmoking Voir le message
    j'ai du mal à visualiser ce qui te pose soucis.
    Ce qui me pose problème, c'est que les boutons de mise en forme, ainsi que le compteur de mots, sont inopérants.
    Ils agissent sur le textarea nommé "texte", mais celui-ci est remplacé visuellement par l'éditeur généré par le JS.
    Je n'arrive pas à répercuter les actions du textarea originel sur celui généré par Codemirror.
    Le mieux n'est pas forcément l'ennemi du bien.

  4. #4
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 056
    Points : 44 578
    Points
    44 578
    Par défaut
    C'est bon j'ai retrouvé la vue

    Pour le compteur de mot
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <textarea cols='110' rows='40' name='texte' id='texte' onkeyup='Compter(this.form.texte.value, this.form)' required>$texte</textarea>
    tu peux simplement ajouter un observateur sur le change de l'éditeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    const editor = CodeMirror.fromTextArea(document.getElementById("texte"), {
      // init des options
    });
    editor.on("change", function() {
      // mise à jour textarea
      editor.save();
      // get nombre caractère avec le \n
      document.getElementById("count").textContent = editor.getValue().length;
    });
    Pour les boutons de mise en forme, il te faut utiliser les méthodes misent à disposition : User manual and reference guide et modifier le texte dans l'éditeur en faisant par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function addBaliseH1() {
      // texte sélectionné
      const txt = editor.getSelection();
      // encadrement avec balises
      editor.replaceSelection("<h1>" + txt + "</h1>");
      // mise à jour textarea, mais pas obligatoire
      editor.save();
      // on remet le focus
      editor.focus();
    }
    et donc un appel du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.getElementById("add-h1").onclick = addBaliseH1;
    On peut faire mieux, c'est très largement « optimisable ».

  5. #5
    Membre actif
    Avatar de Freedolphin
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2006
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2006
    Messages : 291
    Points : 225
    Points
    225
    Par défaut
    Merci mille fois pour ces indications !
    Très bonne journée.
    Le mieux n'est pas forcément l'ennemi du bien.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Coloration syntaxique avec Prism
    Par bndd24 dans le forum Langage
    Réponses: 2
    Dernier message: 12/06/2016, 07h47
  2. Réponses: 4
    Dernier message: 15/01/2016, 13h16
  3. Réponses: 2
    Dernier message: 04/09/2007, 13h53
  4. Coloration syntaxique pour java avec fond noir
    Par thibal_kamehouse dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 02/05/2007, 16h58

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