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 :

Supprimer les child nodetype 3 uniquement si ce sont des espaces voir(nbsp;)


Sujet :

JavaScript

  1. #21
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bonjour watilin
    j'ai un peu galérer au debut mais ca va genial JSHint.com parcontre il faut pas absolument tout corriger sinon dans ie 11 ca ne marchais plus
    associé a beautifier ca me fait des beau codescelui la est propre pour ie 11

    Code HTML : 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
    <!DOCTYPE html>
    <html>
      <head>
     
         <meta http-equiv="X-UA-Compatible" content="IE=10">
    <title>JS Bin</title>
        <style>
          
          .code {       
            border: 1px solid black;
            height: 200px;
            white-space: pre;      
          }
     
        </style>
    <script type="text/javascript">
        function selection() {
            return window.getSelection();
        }
        function getrange() {
            var sel = selection();
            return sel.getRangeAt(0);
        }
     
        function execcom(a, couleur) {
            clearSpaceRange();
            document.execCommand("ForeColor", false, couleur);
            document.getElementById("toto").innerText = document.getElementById("titi").innerHTML;
            var sel = selection();
            sel.removeAllRanges();
        }
     
     
        function clearSpaceRange() {
            document.getElementById("toto").innerText = document.getElementById("titi").innerHTML;
            var sel = selection();
            var range = getrange();
            var parent;
            parent = range.commonAncestorContainer;
            var selectionhtml = range.extractContents();
            var oSpan;
            var fragment;
            oSpan = document.createElement("FONT");
            oSpan.appendChild(selectionhtml);
            if (oSpan.lastChild.innerText === "") { //Important !!! on teste le innertext et pas innerHTML,la balise pouvant contenir d'autre balise vides 
                oSpan.removeChild(oSpan.lastChild);
            } //suppression de la balise droite et vide créée par la fermeture de balise dans l'append en cas de selection croisant 2 balises 
            if (oSpan.firstChild.innerText === "") { //Important !!! on teste le innertext et pas innerHTML,la balise pouvant contenir d'autre balise vides
                oSpan.removeChild(oSpan.firstChild);
            } //suppression de la balise  gauche et vide créée par la fermeture de balise dans l'append en cas de selection croisant 2 balises 
     
            if (oSpan.childNodes.length === 1 && oSpan.childNodes[0].tagName == "FONT") {
                if (oSpan.childNodes[0].typeNode != 3) {
                    osPan.innerHTML = oSpan.childNodes[0].innerHTML;
                }
            } /// si il n'y a qu'une seule balise et pas de typenode 3 alors on prend la balise enfant comme et en tant que  oSpan
     
            if (oSpan.childNodes.length > 1 && oSpan.childNodes[0].tagName == "FONT") {
                var tt = oSpan.childNodes[0].innerHTML;
                var m = tt.trim();
                if (m != tt) {
                    var epg = tt.split(m);
                    oSpan.childNodes[0].innerHTML = m;
                    oSpan.innerHTML = epg + oSpan.innerHTML;
                }
            }
     
            //alert("|" + oSpan.outerHTML + "|");
            var txt = oSpan.innerHTML.replace(/&nbsp\;/gi, " "); // on remplace les "&nbsp;" par un espace dans la variable "txt"
            var milieu = txt.trim(); //on trim le text de "txt"on obtiens ce qu'il faut garder dans oSpan
            var droite = txt.split(milieu)[1]; //on split le txt complet par la valeur de milieu on garde la partie[1] c'est la droite
            var gauche = txt.split(milieu)[0]; //on split le txt complet par la valeur de milieu on garde la partie[0] c'est la gauche
            oSpan.innerHTML = milieu;
            //on met milieu en tant que innerHTML du oSpan on perd donc les coté
     
            //alert("gauche|" + gauche + "|");
            //alert("milieu|" + milieu + "|");
            //alert("droite|" + droite + "|");
     
     
            fragment = range.createContextualFragment(gauche + oSpan.outerHTML + droite); //on met donc les 3 morceaux dans le fragment
            //on cherche maintenant le ospan pour en récupérer l'index dans la hiérarchie
            var fL = fragment.childNodes.length;
            for (var L = 0; L < fL; L++) {
                if (fragment.childNodes[L].tagName == "FONT") {
                    var indC = L;
                } /// on  REPERE oSpan DANS LE FRAGMENT 
            }
            //le depart de la selection devra commencer par oSpan et terminer avec lui
            var firstInsertedNode = fragment.childNodes[indC]; //on determine le debut du fragment AVEC OSPAN
            var lastInsertedNode = fragment.childNodes[indC]; //on determine fin  du fragment AVEC OSPAN
     
     
            range.insertNode(fragment); //on insert le fragment 
            if (firstInsertedNode) {
                range.setStartBefore(firstInsertedNode); // ET VOILA C'EST ICI QUE L'ON GARDE rien que  OSPAN DANS LA SELECTION
                range.setEndAfter(lastInsertedNode);
            }
     
            sel.removeAllRanges(); //on  supprime le range 
            sel.addRange(range); //  on garde la selection active 
            //suppression des espaces de la selection
            range = getrange(); // on reprend le range modifié que j'ai gardé actif
            range.deleteContents(); //on delete son contenu
            range.insertNode(oSpan); // et maintenant que l'on a remis espG,ospan,espD on garde que osPan dans la selection 
            sel.removeAllRanges(); //on peut carrément supprimer le range 
            sel.addRange(range); // on garde la selection active 
     
            document.getElementById("toto").innerText = document.getElementById("titi").innerHTML;
        }
    </script>
      </head>
      <body>
        <div id="titi" class="code" contenteditable="true" spellcheck="false">
         <br>
         <p>Du texte en <font color="#0000ff"><strong>cou<em>leur</strong></em></font> <font color="#ffff00" size="4">pour</font> les <font color="#ff0000">tests</font>   <font color="#00ff99">de</font>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;selection </p>  
     
    </div>
        <br>
     
         <br>
    <button onclick="execcom('false','#FF00FF');">BACKmagenta</button>
     <button onclick="execcom('false','#FF0000');">backrouge</button>
    <button onclick="execcom('false','#00FF00');">bac vert</button>
    <button onclick="execcom('false','#0000FF');">bleu</button>
    <button onclick="execcom('false','#FFFF00');">jaune</button>
     <button onclick="execcom('false','#F8A007');">ORANGE</button>
     
    <button onclick="clearSpaceRange('');">clearspacerange</button>
     
     
    <div id="toto" class="code" style="display:block;"</div>
     
      </body>
    </html>
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  2. #22
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 171
    Points
    17 171
    Par défaut
    Salut

    Ligne 132
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <div id="toto" class="code" style="display:block;"</div> <!-- manque le > balise d'entrée -->
    <div id="toto" class="code" style="display:block;"></div>
    D’où l’intérêt d'indiquer le langage du code posté, quand celui ci n'est pas le langage du forum du postage, la couleur syntactique donnant tout de suite une indication utile.
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  3. #23
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Un petit mot à propos de ce passage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (oSpan.childNodes.length === 1 && oSpan.childNodes[0].tagName == "FONT") {
        if (oSpan.childNodes[0].typeNode != 3) {
            osPan.innerHTML = oSpan.childNodes[0].innerHTML;
        }
    } /// si il n'y a qu'une seule balise et pas de typenode 3 alors on prend la balise enfant comme et en tant que  oSpan
    Si oSpan n’a qu’un seul enfant, tu peux y accéder indifféremment par oSpan.childNodes[0], oSpan.firstChild ou oSpan.lastChild. Pour raccourcir légèrement le code, je choisirais une des deux dernières ; firstChild me paraît plus intuitive.

    On peut avoir envie de créer une variable pour ça, et du coup il faut « couper en deux » le if.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (oSpan.childNodes.length === 1) {
      var child = oSpan.firstChild;
      if (child.tagName === "FONT") {
        ...
      }
    }
    Dans ce second if, tu as nécessairement un enfant qui a une propriété tagName égale à "FONT", il en découle que c’est obligatoirement un nœud de type 1. Tu n’as donc pas besoin de tester le nodeType.

    D’ailleurs à ce propos ton test était mal écrit : la propriété typeNode n’existe pas. Mais JS est retors et ne lève pas d’erreur quand tu consultes une propriété qui n’existe pas sur un objet qui existe. Il se contente de renvoyer undefined.

    Du coup ton test était équivalent à undefined != 3, ce qui est tout le temps vrai, et ainsi ça marchait quand même par accident.

    Au final, l’extrait de code peut se simplifier comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (oSpan.childNodes.length === 1) {
      var child = oSpan.firstChild;
      if (child.tagName === "FONT") { // nodeType === 1 obligatoirement
        oSpan.innerHTML = child.innerHTML;
      }
    }
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  4. #24
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    merci watilin

    je vais corriger ça dans cette version c'est vrai que c'est plus propre
    cela dit c'est une erreur de ma part de croire que si 1 seul enfant comme c'est un FONT il faut s'occuper que de lui
    je l'ai eu en pleine figure cet après midi en cas de em,strong,u,S imbriqués

    en parallèle j’apprends aussi à me servir de "createrange" et je pense avoir trouvé une solution propre

    basée sur l'idée que le fragment comportant soit
    un font
    un blanc,un font
    un font,un,blanc
    un blanc,un font,un blanc

    et bien je donne un "ID" a ce font
    en réinsérant le fragment le font avec id est plus facilement identifiable dans le content éditable
    je peut donc me servir de createrange sur la base de ce font avec ID quitte a lui enlever l'attribut "id" lorsqu'il est identifié
    pour le start et end c'est simple y a pas a chercher a comprendre c'est 0 por start et et son chilNodes.length pour la fin
    j'obtiens bien ma sélection sans espaces

    j'ai 2 derniers soucis qui sans doute sont tres simples mais la ca a du mal a rentrer
    je voudrais remplacer donc cette sélection créée avec ce font par son innerhtml sans perdre le hightlight c'est a dire le code original de milieu

    le 2d étant des balise vides em,strong,etc..... qui se produise APRÈS!!!! insertNode, je le réglerais après

    voila le code avec version createrange j'ai mis en commentaire la suppression de l'attribut "ID" pour un visuel
    j'ai virer les "alert" et les ai remplacer par des console.log j'avais un peu mal a la tête avec le tinding des messages

    je l'ai passer a JSHINT et BEAUTIFIER

    CODE COMPLET FICHIER LOCAL
    Code HTML : 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
    <!DOCTYPE html>
    <html>
      <head>
     
         <meta http-equiv="X-UA-Compatible" content="IE=10">
    <title>JS Bin</title>
        <style>
          
          .code {       
            border: 1px solid black;
            height: 200px;
            white-space: pre;      
          }
     
        </style>
    <script type="text/javascript">
        var oSpan;
    function execcom(a, couleur) {
        clearSpaceRange();
        document.execCommand("ForeColor", false, couleur);
        document.getElementById("toto").innerText = document.getElementById("titi").innerHTML;
    }
     
    function selection() {
        return window.getSelection();
    }
    function getrange() {
        var sel = selection();
        return sel.getRangeAt(0);
    }
     
    function clearSpaceRange() {
        var sel = selection();
        var range = getrange();
        //var parent = range.commonAncestorContainer;
        var selectionhtml = range.cloneContents();
        oSpan = document.createElement("FONT");
        oSpan.appendChild(selectionhtml);
        var elem = oSpan.getElementsByTagName("FONT");
        var txt = oSpan.innerHTML.replace(/&nbsp\;/gi, " ");
        console.log("texte avec nbsp remplacé");
        console.log(" |" + txt + "|");
        for (var i = 0; i < elem.length; i++) {
            if (elem[i].innerText === "") {
                txt = txt.replace(elem[i].outerHTML, "");
            }
            //if (elem[i].innerText ===" "){txt = txt.replace(elem[i].outerHTML, " "); }    
        }
     
        var milieu = "<font id=\"aaa\">" + txt.trim() + "</font>";
        var code = txt.replace(txt.trim(), milieu);
        console.log("etat du segment complet ");
        console.log("|" + code + "|");
        var fragment = range.createContextualFragment(code);
        range.deleteContents();
        range.insertNode(fragment);
        sel.removeAllRanges();
        //Maintenant le que le font id "aaa" est dedans et ne contient pas d'espace on va le selectionner cette fois si avec createrange() puisque l'on peu l'identifier exactement 
        var EL = document.getElementById("aaa");
        range = document.createRange();
        //EL.removeAttribute("ID");
        range.setStart(EL, 0);
        range.setEnd(EL, EL.childNodes.length);
        sel = selection();
        sel.addRange(range);
        console.log(" etat de la selection finale :");
        console.log(" selection finale  " + EL.outerHTML);
        document.getElementById("toto").innerText = document.getElementById("titi").innerHTML;
    }
     
    </script>
      </head>
      <body>
        <div id="titi" class="code" contenteditable="true" spellcheck="false">
         <br>
         <p>Du texte en <font color="#0000ff"><strong>cou<em>leur</strong></em></font> <font color="#ffff00" size="4">pour</font> les <font color="#ff0000">tests</font>   <font color="#00ff99">de</font>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;selection </p>  
     
    </div>
        <br>
     
         <br>
    <button onclick="execcom('true','false');">nocouleur</button>
    <button onclick="execcom('false','#000000');">black</button>
    <button onclick="execcom('false','#FF0000');">backrouge</button>
    <button onclick="execcom('false','#00FF00');">bac vert</button>
    <button onclick="execcom('false','#0000FF');">bleu</button>
    <button onclick="execcom('false','#FFFF00');">jaune</button>
     <button onclick="clearSpaceRange('');">clearSpace</button>
     
     
     
    <div id="toto" class="code" style="display:block;"</div>
     
      </body>
    </html>
    regarde bien le résultat dans toto
    regarde bien aussi la console elle donne l’état du code étape par étape
    merci pour la patience
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #25
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Salut,

    Tu vas finir par écrire ta propre fonction execCommand personnalisée... Dans l'ancien fil on en avait parlé je crois...

    Certains l'ont fait mine de rien...



    Citation Envoyé par patricktoulon Voir le message
    cela dit c'est une erreur de ma part de croire que si 1 seul enfant comme c'est un FONT il faut s'occuper que de lui
    je l'ai eu en pleine figure cet apres midi en cas de em,strong,u,S imbriqués
    J'y pensais justement, est-ce que ça marche toujours avec d'autres balises ?

    Je crois qu'il y a aussi d'autres cas qui peuvent poser problèmes : dans certains cas je pense que execCommand optimise et n'ajoute pas de balise <font>, si par exemple il y en a déjà une autour de la sélection et que tu veux ajouter un style (une couleur par exemple) à cette sélection eh bien il pourrait ajouter ce style à la balise <font> déjà présente...

    Du coup si tu fait un removeFormat pour supprimer uniquement ce style que tu viens d'ajouter il ne faut pas supprimer la balise font mais juste le style et ça c'est du boulot en plus...

    Citation Envoyé par patricktoulon Voir le message
    et bien je donne un "ID" a ce font
    en réinserant le fragment le font avec id est plus falicement identifiable dans le content editable
    Un id doit être unique donc ça va si tu n'as qu'une seule balise font qui est ajoutée mais je ne suis pas sûr que ce soit toujours le cas...

    Par exemple si la sélection est à cheval sur plusieurs balises execCommand soit va ajouter plusieurs balises font soit il va fermer et rouvrir les autres balises pour ne mettre qu'une seule balises font.

    Cela dépend des navigateurs...

  6. #26
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    non beguiner tu n'a pas compris

    en fait dans la version avec le font id"aaa" lid est suprimer AVAN!!! EXECCOMMAND il n'y en donc toujours qu'un
    dans le code que j'ai poster en dernier j'ai mis la supression du id en comentaire pour que tu vois comment et ou est cette balise

    donc au final je me retrouve avec <font id= aaa><font...etc.........< find'eventuel enfant></font>

    a l'interieur ca peut etre simplement un textnode

    quand j'en suis la la selection contient juste le font id aaa ce que je voudrais c'est rerecuperer le getrange et delete en lui re insérant l'interieur du font aaa

    debloque le comentaire tu vera il n'y a plus le ID mais la variable EL c'est !!! le font aaa on peut donc toujours le recupérer

    en vb je les ai deja fait les fonctions equivalente a execcommand

    tu ne peux meme pas imaginer ce que l'on peut faire avec ca et a l'interieur
    with createobject("htmlfile")
    end with
    eguille moi sur le moyen de ne garder que le innerhtml de font aaa et
    le reste des balise vides ou en doublons on verra apres

    attention quand meme a la meprise sur mes intentions actuelles je ne cherches pas a imiter execcommand en JS
    je veux juste faire un clearspace avant de l'executer
    je touche au but
    je selectionne dans le code obtenu ce que je souhaiterais garder

    Nom : demo2.gif
Affichages : 135
Taille : 1,51 Mo
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #27
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Cest vrai que parfois j'ai du mal à suivre notament parcqu'il me semble qu'on avait déjà discuté de tout ça...

    Citation Envoyé par patricktoulon Voir le message
    quand j'en suis la la selection contient juste le font id aaa ce que je voudrais c'est rerecuperer le getrange et delete en lui re insérant l'interieur du font aaa

    ...
    eguille moi sur le moyen de ne garder que le innerhtml de font aaa et
    Ben NoSmoking t'a déjà aiguillé en te rappelant le fil de 9 pages concernant cela : Remplacement d'un élément par son innerHTML où entre autres il avait posté son code au message #88.

    Citation Envoyé par patricktoulon Voir le message
    je veux juste faire un clearspace avant de l'executer
    Là aussi pareil, tu avais ouvert un fil (Supprimer les espaces avant/arrière d'une étendue Range) sur ça, non ? Tu voulais supprimer les espaces aux extrémités de la sélection...

    Je me souviens avoir proposé une solution au message #8.

    La sélection était automatiquement modifiée pour ne garder que le texte du milieu sans les espaces aux extrémités...

    Il y a aussi la solution de NoSmoking : #39

  8. #28
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Ah oui toujours en rapport avec ta question, j'avais ouvert aussi ce fi : La fonction unwrap() en JS pur ?.

    Cette fonction est notamment utile pour supprimer la surbrillance* des mots trouvés...

    Mais ça correspond à ce que tu veux, c'est le même principe...

    * Regarde ce code : http://jsbin.com/lapikifose/edit?js,output où j'ai testé trois fonctions "removeHightlight"...

  9. #29
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    bon ben je vien d'ssayé les deux les deux methodes fonctionnent mais me supprime la sellection
    mais ton outerhtml/innerhtml ca tu vois en vb pas possible visiblement en JS oui

    je vais devoir refaire un getrange > clonecontent > appenchild dans une balise > fragment innerHTML > delete content > insertNode > sel addrange
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  10. #30
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Re Patrick,
    je n’ai pas pris le temps de regarder ton nouveau code en détail, mais je reviens sur cette histoire d’id qui doit être unique. Tu peux garantir cette unicité en générant un id aléatoirement et en vérifiant que l’id n’est pas déjà présent dans la page.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function generateRandomId(prefix) {
      if (!prefix) prefix = "_";
      return prefix + Math.random().toString(36).substring(2);
    }
    L’idée est la suivante :
    1. On commence par un préfixe car la spec dit qu’un id ne peut pas commencer par un nombre ;
    2. On prend un nombre aléatoire avec Math.random() et on le convertit en base 36 pour qu’il utilise toutes les lettres de l’alphabet (base 36 = 10 chiffres + 26 lettres) ;
    3. On supprime les deux premiers caractères qui sont toujours 0..


    Dans le cas où la fonction ne reçoit pas de préfixe en paramètre, elle choisit "_" par défaut, mais là on va lui passer "aaa" comme tu as fait.

    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 trimmedTxt = txt.trim();
    var milieu = document.createElement("font");
     
    var randomId;
    do { // on boucle au moins une fois...
      randomId = generateRandomId("aaa");
      // ... et on recommence tant qu’il y a un élément avec cet id dans la page
    } while (document.getElementById(randomId));
     
    console.log("randomId: " + randomId);
    milieu.id = randomId;
     
    milieu.innerHTML = trimmedTxt;
    var code = txt.replace(trimmedTxt, milieu);
    Avec le random, la probabilité de collision est déjà très faible (*), et avec la boucle do/while, on fait monter la garantie à 100 %.

    Et bien sûr, plus bas dans ton code, tu te sers de la variable randomId pour récupérer une référence sur ton élément.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var EL = document.getElementById(randomId);


    (*) Le calcul est assez simple : un Math.random() produit en général 16 chiffres après la virgule (en base 10), ce qui nous fait une chance sur 10 puissance 16 de tomber sur un nombre donné. Le changement de base ne change pas la probabilité. Et 10 puissance 16, c’est dix millions de milliards…
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  11. #31
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    mais non watilin
    le id "aaa" est retiré une fois ciblé dans la ligne "P"

    il n'est donc pas necessaire d'incrementer

    regarde bien le code teste en debloquant la ligne de suppression du ID

    c'est pas le soucis
    le soucis c'est que j'ai a la fin ma selection sans espaces mais dans un font(celui qui avais le id"aaa")

    alors quand j'execute execcommand (forecolor,false,null) apres le clearspace OK ca le netoie mais pas pour par exemple execcommand( bold italic underline etc......)je veux dont pendant que j'ai ma selection sans espace en hightlight la remanier et ne garder que le innerhtml
    c'est donc en toute logique que doive passer par une reselection juste en faisant un deletecontent puis réappend d'un fragment contenant uniquement le innerHTML de la font qui AVAIT!!! le id "aaa"
    je testerais demain soir sur mon portable je part pour 3 jours sur cavaillon
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  12. #32
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Bonjour a tous

    Bon!!
    avant de partir pour aller tâter les melons de cavaillon ce matin je me suis levé avec ca qui me trottais dans la tête j’étais trop prés du résultat souhaité pour reprendre dans trois jours

    et bien on y est
    le projet était pour être précis : supprimer les espaces dans une sélection afin de pouvoir modifier le contenu sans prendre les espaces dans les nouvelle balise créées avec execCommand par exemple

    après avoir fusé de tout les cotés j'ai enfin trouver bonheur!!

    la chose était très simple

    donc on gardera le modèle avec createrange
    1. un getrange
    2. un trim de la selection
    3. encapsulage du trim dans un font avec ID "aaa"
    4. création d'un contextualfragment(fragment) avec le code de la selection et son font "aaa" avec espaces ou pas autour
    5. création d'un 2d contextualfragment(fragment) avec le code innerHTML du font "aaa"
    6. réinsertion dans le range du fragment1
    7. le font "aaa" est maintenant dans le document
    8. création d'un range avec pour argument le font "aaa"( on ne peut pas le raté) avec les setstart 0 et setend par le font lui meme et le nombre de ses enfants
    9. on a maintenant notre selection sans espaces
    10. on laisse le range actif avec sel.addrange(range)
    11. surprise surprise on remove le font"aaa" (la vous vous dites ca y est on la perdu ) mais non mais non !!!
    12. on réinsere dans le range actif et vide( puisque l'on a assasiné mon font "aaa" )le fragment2!!!
    13. on garde le range actif avec sel.addrange(range)


    et voila messieux j'ai ma selection sans espaces et le code n'est pas modifié il est revenu a son point de depart

    exemplaire fichier local html
    Code HTML : 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
    <!DOCTYPE html>
    <html>
      <head>
     
         <meta http-equiv="X-UA-Compatible" content="IE=10">
    <title>JS Bin</title>
        <style>
          
          .code {       
            border: 1px solid black;
            height: 200px;
            white-space: pre;      
          }
     
        </style>
    <script type="text/javascript">
        var oSpan;
    function execcom(a, couleur) {
        clearSpaceRange();
        document.execCommand("ForeColor", false, couleur);
        document.getElementById("toto").innerText = document.getElementById("titi").innerHTML;
    }
     
    function selection() {
        return window.getSelection();
    }
    function getrange() {
        var sel = selection();
        return sel.getRangeAt(0);
    }
     
    function clearSpaceRange() {
        var sel = selection();
        var range = getrange();
         var selectionhtml = range.cloneContents();
        oSpan = document.createElement("FONT");
        oSpan.appendChild(selectionhtml);
        var elem = oSpan.getElementsByTagName("FONT");
        var txt = oSpan.innerHTML.replace(/&nbsp\;/gi, " ");
        console.log("texte avec nbsp remplacé");
        console.log(" |" + txt + "|");
        for (var i = 0; i < elem.length; i++) {
            if (elem[i].innerText === "") {
                txt = txt.replace(elem[i].outerHTML, "");
            }
            //if (elem[i].innerText ===" "){txt = txt.replace(elem[i].outerHTML, " "); }    
        }
     
        var milieu = "<font id=\"aaa\">" + txt.trim() + "</font>";
        var code = txt.replace(txt.trim(), milieu);
        console.log("etat du segment complet ");
        console.log("|" + code + "|");
        var fragment = range.createContextualFragment(code);
        var fragment2 = range.createContextualFragment(txt.trim());
        range.deleteContents();
        range.insertNode(fragment);
        sel.removeAllRanges();
        //Maintenant le que le font id "aaa" est dedans et ne contient pas d'espace on va le selectionner cette fois si avec createrange() puisque l'on peu l'identifier exactement 
        var EL = document.getElementById("aaa");
        range = document.createRange();
        //EL.removeAttribute("ID");
        range.setStart(EL, 0);
        range.setEnd(EL, EL.childNodes.length);
        sel = selection();
        sel.addRange(range);
        console.log(" etat de la selection finale :");
        console.log(" selection finale  " + EL.outerHTML);
        
      //************************************************************************  
        //et voila maintenant on vire le font" aaa" et on met a la place son innerhtml dans la selection
        EL.parentNode.removeChild(EL);
        range.insertNode(fragment2);
        sel = selection();
        sel.addRange(range);
        // RESULTAT ON A NOTRE SELECTION  sans espace et SANS!!!!!! avoir modifié le code !!!!
      
    document.getElementById("toto").innerText = document.getElementById("titi").innerHTML;
    }
     
    </script>
      </head>
      <body>
        <div id="titi" class="code" contenteditable="true" spellcheck="false">
         <br>
         <p>Du texte en <font color="#0000ff"><strong>cou<em>leur</strong></em></font> <font color="#ffff00" size="4">pour</font> les <font color="#ff0000">tests</font>   <font color="#00ff99">de</font>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;selection </p>  
     
    </div>
        <br>
     
         <br>
    <button onclick="execcom('true','false');">nocouleur</button>
    <button onclick="execcom('false','#000000');">black</button>
    <button onclick="execcom('false','#FF0000');">backrouge</button>
    <button onclick="execcom('false','#00FF00');">bac vert</button>
    <button onclick="execcom('false','#0000FF');">bleu</button>
    <button onclick="execcom('false','#FFFF00');">jaune</button>
     <button onclick="clearSpaceRange('');">clearSpace</button>
     
     
     
    <div id="toto" class="code" style="display:block;"</div>
     
      </body>
    </html>

    comme vous pouvez le voir dans la démo le code dans le div de visionnage du code ne change pas
    Nom : demo2.gif
Affichages : 132
Taille : 557,4 Ko
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  13. #33
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Salut,

    Ah bah tant mieux si tu as trouvé ton bonheur, ta persévérance a payé, bravo !

    Je regarderai le code plus tard...

    Citation Envoyé par patricktoulon Voir le message
    re
    bon ben je vien d'ssayé les deux les deux methodes fonctionnent mais me supprime la sellection
    Oui c'est normal mais si on veux sélectionner le innerHTML eh bien une solution pourrait être de sauvegarder le firstchild et le lastchild du outerHTML (avant sa suppression) ensuite tu le supprimes puis tu sélectionnes le innerHTML avec un range qui commence au firstchild et qui finit au lastchild...

  14. #34
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    bonsoir beguiner
    oui je suis satisfait ca fait exactement le boulot comme je le voulais
    je vais passer au netoyage des balises identiques qui se suivent maintenant un moindre mal avec les deux methodes que tu utilise dans ta demo dans le lien

    merci a tous
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Supprimer les doublons uniques
    Par jim29 dans le forum Scilab
    Réponses: 2
    Dernier message: 02/04/2015, 18h50
  2. Les utilisateurs de Tor et Linux Tails sont des extrémistes pour la NSA
    Par Hinault Romaric dans le forum Actualités
    Réponses: 27
    Dernier message: 07/07/2014, 16h39
  3. XMLOutputter qui supprime les passage a la lignes mais pas les tags uniquement blanc
    Par pcouas dans le forum Format d'échange (XML, JSON...)
    Réponses: 11
    Dernier message: 30/03/2014, 15h57
  4. Réponses: 3
    Dernier message: 06/03/2014, 20h44
  5. Creer clef unique et supprimer les doublons
    Par olibara dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 13/06/2011, 20h07

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