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. #1
    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 Supprimer les child nodetype 3 uniquement si ce sont des espaces voir(nbsp;)
    bonjour a tous
    jusqu'a present je le faisait en string en decantant la chaine formant le code html mais j'aimerais bien le faire un peu plus proprement

    voila une selection de texte dans un conteneditable dans une balise peut donner quelques bizarrerie on la deja vu

    mon soucis mis a part la creation de balise vides que je gere parfaitement bien j'ai un soucis avec les espaces et/ou "nbsp;" qui sont des childNodes de type 3

    je voudrais supprimer que celles la
    alors dans une boucle que j'ai limiter a 10 tours je les enleves suf que quelques fois ces childNodes type 3 sont une partie de texte qu'il ne faut bien évidement pas supprimer
    et c'est la que ce pose mon soucis comment identifier le texte de ces childNodes type 3
    innerHTML donnant undefined ainsi que innerText
    quelqu'un aurait une idée
    merci du retour

    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
    function selection() {
                       return window.getSelection();
                                }
     
    function getrange() {
                          var sel=selection(); 
                         return sel.getRangeAt(0);
                                 }
     
    function clearSpaceRange(){
               var sel = selection();
            var parent = sel.getRangeAt(0).commonAncestorContainer;
            var range=getrange();
            var selectionhtml=range.cloneContents(); 
            var oSpan = document.createElement("SPAN");
            var oSpan2 = document.createElement("SPAN");
            oSpan.appendChild(selectionhtml);
            if(oSpan.lastChild.innerHTML==""){ oSpan.removeChild(oSpan.lastChild);}//suppression de la balise vide créée par la fermeture de balise dans l'append en cas de selection croisant 2 balises 
     
             alert("|" + oSpan.innerHTML +"|");
     
             oSpan2.innerHTML=oSpan.innerHTML
             alert("voir type  " + oSpan2.childNodes[oSpan2.childNodes.length -1 ].nodeType);//regard sur le dernier child affiche 3 si nodetype 3
     
              for (var i = 0; i < 10; i++) {
                 if(oSpan2.lastChild.nodeType===3){ 
                                                                         alert(oSpan2.lastChild.nodeText);oSpan2.removeChild(oSpan2.lastChild);
                                                                         }
                                                   }
     
             alert("oSpan2  |" + oSpan2.innerHTML +"|");
     
            //fragment=range.createContextualFragment( oSpan.innerHTML );
     
     
    }
    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. #2
    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
    autant pour moi je suis une bourrique c'est "textContent"
    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

  3. #3
    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,

    Dans ton code je vois que tu testes si le texte est vide mais ne devrais-tu pas tester si il contient seulement des espaces ?

    En plus il y a plusieurs types d'espaces, non ?

  4. #4
    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
    bonsoir beguiner
    dans le code que j'ai posté je ne teste que les vides("")
    ca c'est pour enlever la balise qui se créé autiomatiquement sur selection croisant 2 balises

    les tests espaces viennent ensuite

    et le textContents ne fait pas la difference je crois non ?les espaces sont les memes non?
    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. #5
    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
    innerText a été introduit par Microsoft dans IE6 et les autres navigateurs ont mis un moment avant de l’adopter ; il n’a été standardisé que très récemment. textContent c’est un peu l’inverse : il est spécifié dans le DOM niveau 3, il est supporté depuis longtemps par tout le monde sauf IE, et pour ce dernier il a fallu attendre la version 9.

    En dehors de cet aspect historique, il y a une différence importante entre les deux : textContent inclut le code source des <style> et <script> in-line (c’est-à-dire qui ne sont pas dans un fichier externe), alors que innerText les ignore.

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <script>
    alert("bonsoir");
    </script>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    document.querySelector("script").textContent
    // alert("bonsoir")
     
    document.querySelector("script").innerText
    // ""
    À mon avis, innerText remplit mieux son rôle que son concurrent standard, puisqu’on parle de restituer une représentation textuelle du contenu de l’élément concerné. Ah oui parce que je ne l’ai pas dit, innerText est assez intelligent pour ignorer les éléments qui sont masqués par une règle display: none.
    Bref, pour une fois, c’est Microsoft qui a fait les choses correctement (article en anglais).


    Oh, en ce qui concerne les nœuds de type 3 : tu peux utiliser l’attribut nodeValue, un truc générique présent sur tous les types de nœud ; ou alors data qui est spécifique aux nœuds de texte.

    Également, il peut être utile de savoir que le code d’échappement de l’espace insécable &nbsp;, dans les chaînes JavaScript, est "\xA0" (l’équivalent unicode est "\u00A0").
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  6. #6
    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 c'est intéressant tout ça. Merci.

    Ainsi je déduit que innerText est mieux si on veut faire une recherche d'un mot dans un document ! Car normalement on cherche dans le texte visible...


    PS : Il y a aussi data ou nodeValue...

  7. #7
    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
    oui j'ai vue pour data et node value

    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
     
    function execcom(couleur,a){
    document.execCommand ("ForeColor",false,couleur);
     document.getElementById("toto").innerText=document.getElementById("titi").innerHTML;
     
    }
     
     
    function execcom2(b){
    document.execCommand("removeFormat",true,b);
    }
    function selection() {
              return window.getSelection();
            }
     
    function getrange() {
             var sel=selection(); 
            return sel.getRangeAt(0);
            }
     
     
    function clearSpaceRange(){
               var sel = selection();
            var parent = sel.getRangeAt(0).commonAncestorContainer;
     var range=getrange();
            var selectionhtml=range.cloneContents(); 
            var oSpan = document.createElement("SPAN");
            var oSpan2 = document.createElement("SPAN");
            oSpan.appendChild(selectionhtml);
            if(oSpan.lastChild.innerHTML==""){ oSpan.removeChild(oSpan.lastChild);}//suppression de la balise vide créée par la fermeture de balise dans l'append en cas de selection croisant 2 balises 
     
             alert("|" + oSpan.textContent +"|");
     
             oSpan2.innerHTML=oSpan.innerHTML
             alert("voir type  " + oSpan2.childNodes[oSpan2.childNodes.length -1 ].nodeType);//regard sur le dernier child affiche 3 si nodetype 3
     
     
                 if(oSpan2.lastChild.nodeType===3){ 
                     var txtG=oSpan2.lastChild.textContent.txt.trim()
                     //ici il faut que je split oSpan(le 1) avec le trim du nodetexte de droite de ospan2 et ne garder que la partie gauche en mettant dans dans une variable la partie que j'ai supprimé
                      oSpan2.removeChild(oSpan2.lastChild);
     
                    else{
     
                    //on garde commetel pour la droite
     
     
                        }
     
     
             // ici rebelotte mais pour la gauche 
     
     
    alert("ospan2  |" + oSpan2.innerHTML +"|");
     
    }
    trimright et left visiblement n'etant pas compatible ie je ne peux pas m'en servir dommage ca aurait été plus simple

    sans compter toute les erreur je me melange les pinceaux (vb/javascript)
    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

  8. #8
    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
    bonsoir waitilin

    le "innerText" ne restitue ni le code ni le text d'un nodetype 3(nodetext) j'ai "undefined"

    il me faut donc determiner si
    le texte de droite est un nodetype3
    lui enlever les espaces ces memes espace je les met dans une variable

    determiner la meme chose pour le firstchild mais supprimer cette fois ci les espaces de gauche et mettre ceci dans une variable

    une fois cela je merge les partie gauche (texte valide) la partie du milieu et les partie droite de texte valide
    j'obtient donc le code de ma selection sans espace
    je met donc la variable de espaces que j'ai gardé + le milieu reconstutué plus la variable espaces droite dans mon fragment

    je ferais un startbefore et after dans le range apres
    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

  9. #9
    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
    Bonjour a tous
    bon visiblement je suis une Buse
    la chose etait beaucoup plus simple que ca

    un replace et un trim

    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
    function clearSpaceRange(){
               var sel = selection();
            var parent = sel.getRangeAt(0).commonAncestorContainer;
     var range=getrange();
            var selectionhtml=range.cloneContents(); 
            var oSpan = document.createElement("FONT");
            oSpan.appendChild(selectionhtml);
            if(oSpan.lastChild.innerHTML==""){ oSpan.removeChild(oSpan.lastChild);}//suppression de la balise vide créée par la fermeture de balise dans l'append en cas de selection croisant 2 balises 
     
     
     
             //alert("voir type  " + oSpan2.childNodes[oSpan2.childNodes.length -1 ].nodeType);//regard sur le dernier child affiche 3 si nodetype 3
     
             var txt =oSpan.innerHTML.replace(/&nbsp\;/gi, " ") ;    
    milieu=txt.trim();
    droite =txt.split(milieu)[1] ;      
    gauche=txt.split(milieu)[0]  ;droite=droite.replace(/ \ /gi, /&nbsp\;) ;     
     
    oSpan.innerHTML=milieu;
     
     alert("gauche|" + gauche + "|");
     alert("milieu|" + milieu + "|");
     alert("droite|" + droite + "|");
     
     
     
     
            fragment=range.createContextualFragment( gauche +oSpan.outerHTML +droite );
     
    }
    il me reste a trouver la formule pour faire un dernier replace sur gauche et droite par "&nbsp;" si par le meme parent hors (P) afin d'eviter d'avoir des "&nbsp;" la ou ca n'est pas necessaire

    donc il me faut le droite.replace (" "/gi,"&nbsp\;") celle ci ne fonctionnant pas bien entendu
    edit:

    visiblement il doit me manquer quelque chose
    si je replace 1 espace par "&nbsp;" ca fonctionne mais des que je met l'argument"gi" ca plante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    droite=droite.replace(" ", "&nbsp\;") ;///fonctionne
    droite=droite.replace(" "/gi, "&nbsp\;") ;///fonctionne pas
    je continue a chercher
    comment on fait le bébés
    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. #10
    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
    Bonjour a tous
    Bon ben voila c'est OK
    a ma grande surprise mon soucis des nbsp; etait que dans ma tete il n'y avais pas de replace a faire car dans le contentents editable ca sefait tout seul

    donc je repete le projet etait de faire une fonction replace espace dans une selection reprenant l'idée de mon ancien wysiwyg mais plus proprement et d'en faire une fonction séparé pour l'appliquer avant forecolor,baccolor bold,etc........
    tandis qu'avant elle etait dans ma fonction textshadow uniquement

    voila qui est fait
    le principe
    je selectionne(avec la souris)
    je met la selection dans une balise font
    je remplace tout les "&nbsp;" par des " " simplement
    je trim le code et j'obtiens donc le code de ma selection sans espaces
    je split le ospan complet avec le code obtenu sans espace le 0 pour la gauche , le 1 pour la droite
    je met le tout dans un fragment créé dynamiquement dans l'ordre bien entendu

    je repere ensuite l'index de oSpan dans la hiérachie du fragment l
    j'applique cet index au startbefore et after a ma range
    je remet en place ma selection j'ai donc tout a nouveau
    et je garde ma selection active
    je reprends la selection active (getrangeAt(0))
    je remove le range et lui colle seullement le ospan
    et je garde a nouveau ma selection active

    voila maintenant je peut utiliser execCommand(forecolo,backcolo,bols,u,i,etc......
    a chaque fois les balises n'auront pas d'espaces en debut et fin

    si vous avez des suggestion pour rendre encore plus propre la chose je prends

    voila le code complet dans un html local

    avant de changer la couleur avec les bouton ,cliquer sur le bouton clearspacerange
    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
    <!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 execcom(a, couleur) {
            document.execCommand("ForeColor", false, couleur);
            document.getElementById("toto").innerText = document.getElementById("titi").innerHTML;
        }
     
     
        function execcom2(b) {
            document.execCommand("removeFormat", true, b);
        }
        function selection() {
            return window.getSelection();
        }
        function getrange() {
            var sel = selection();
            return sel.getRangeAt(0);
        }
     
     
        function clearSpaceRange() {
            document.getElementById("toto").innerText = document.getElementById("titi").innerHTML
            var sel = selection();
            var range = getrange();
            var parent = range.commonAncestorContainer;
            var selectionhtml = range.extractContents();
            var oSpan = document.createElement("FONT");
            oSpan.appendChild(selectionhtml);
            if (oSpan.lastChild.innerHTML == "") {
                oSpan.removeChild(oSpan.lastChild);
            } //suppression de la balise vide créée par la fermeture de balise dans l'append en cas de selection croisant 2 balises 
     
     
            var txt = oSpan.innerHTML.replace(/&nbsp\;/gi, " "); // on remplace les "&nbsp;" par un espace dans la variable "txt"
            milieu = txt.trim(); //on trim le text de "txt"on obtiens ce qu'il faut garder dans oSpan
            droite = txt.split(milieu)[1]; //on split le txt complet par la valeur de milieu on garde la partie[1] c'est la droite
            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
            var 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="#ff00ff"><strong>couleur</strong></font> <font color="#0066ff" size="4">pour</font> les <font color="#ff3399">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('');">clearspacerange</button>
     
     
    <div id="toto" class="code"/>
     
      </body>
    </html>

    merci pour vos retours
    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

  11. #11
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Bonjour,
    je t'engage à relire tes anciennes discussions dans lesquelles nous avons déjà longuement discuté de tout cela, par exemple


    [EDIT] Correction des liens

  12. #12
    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 nosmoking
    je les ai regardés pour rapel memoire
    j'essaie de travailler plus proprement en terme de codage JS

    il etait important que je remplace tout ses (split,replace et boucle sur len(chaine) et rebelotte a l'envers) par quelques chose de plus propre sinon oui elles fonctionnent encore il n'y a pas de soucis
    pour rappel memoire voila la partie de la dont tu parle qui concerne l'encapsulement des espaces
    tu en conviendra c'est pas top
    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
    function shadowcolor(coul, MOD) {
        var espG = " ";
        espD = " "
        var sel = window.getSelection();
        var parent = sel.getRangeAt(0).commonAncestorContainer;
        if (parent.nodeType === 3) {
            parent = parent.parentNode;
        }
        var mySelecthtml = sel.getRangeAt(0).extractContents();
        var oSpan = document.createElement("SPAN");
        oSpan.appendChild(mySelecthtml);
        var B = oSpan.getElementsByTagName("*")
        var str = oSpan.innerHTML;
        for (var i = 0; i < B.length; i++) {
            if (B[i].tagName == "SPAN") {
                str = str.replace(B[i].outerHTML, B[i].innerHTML);
            }
            if (B[i].innerText == "" && B[i].tagName != "IMG") {
                str = str.replace(B[i].outerHTML, "");
            }
        }
        ////////////////////////////////////////////////
        var tx = str;
        console.log(tx);
        var tx = tx.replace(/&nbsp\;/gi, "*");
        var G;
        for (G = 0; G < tx.length; G++) {
            if (tx[G] == "*" || tx[G] == " ") continue;
            else break;
        }
        var D;
        for (var D = tx.length - 1; D > 0; D--) {
            if (tx[D] == "*" || tx[D] == " ") continue;
            else break;
        }
        var espG = tx.substring(0, G).replace(/\*/gi, "&nbsp\;");
        var midle = tx.substring(G, D + 1).replace(/\*/gi, "&nbsp\;");
        var espD = tx.substring(D + 1).replace(/\*/gi, "&nbsp\;");
        oSpan.innerHTML = midle;
        var range = sel.getRangeAt(0)
        range.deleteContents(); // on delete le range complet 
        if (range.createContextualFragment) {
            fragment = range.createContextualFragment(espG + oSpan.outerHTML + espD); //on créé un fragment avec espG ,oSpan et espD
        }
    cette nouvelle version est beaucoup plus claire

    il me reste et je l'ai remarqué apres en testant dans tout les sens qu'une selection contenant 1 seule balise dans la quelle il y a un blanc a droite ou a gauche ou les deux n'est pas prise en compte
    je vais rectifier cela tout a l'heure avec insertbefore puisque tu en parle(me le rappelle) voir meme remplacer oSpan simplement par celle ci avant le traitement des blancs tout simplement

    merci
    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. #13
    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
    bon je pense avoir corrigé
    correction:
    1. le firstchild vide
    2. le chilnodes length et si child 0 tag = font 1 ospan=child 0


    j'ai juste un soucis mais visuel si je clique sur clear puis sur un bouton couleur ok le hilight visuel est correcte
    si je lance la fonction dans execcom avant execcommand le visuel n'est pas correct mais oh!! surprise le boulot est fait

    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
    <!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 execcom(a, couleur) {
            clearSpaceRange;
            document.execCommand("ForeColor", false, couleur);
            document.getElementById("toto").innerText = document.getElementById("titi").innerHTML;
        }
     
     
        function execcom2(b) {
            document.execCommand("removeFormat", true, b);
        }
        function selection() {
            return window.getSelection();
        }
        function getrange() {
            var sel = selection();
            return sel.getRangeAt(0);
        }
     
     
        function clearSpaceRange() {
            document.getElementById("toto").innerText = document.getElementById("titi").innerHTML
            var sel = selection();
            var range = getrange();
            var parent = range.commonAncestorContainer;
            var selectionhtml = range.extractContents();
            var 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
     
            //alert("|" + oSpan.outerHTML + "|");
            var txt = oSpan.innerHTML.replace(/&nbsp\;/gi, " "); // on remplace les "&nbsp;" par un espace dans la variable "txt"
            milieu = txt.trim(); //on trim le text de "txt"on obtiens ce qu'il faut garder dans oSpan
            droite = txt.split(milieu)[1]; //on split le txt complet par la valeur de milieu on garde la partie[1] c'est la droite
            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 
            //fragment2 = range.createContextualFragment(oSpan.innerHTML);
            //suppression des espaces de la selection
            var 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="#ff00ff"><strong>cou<EM>leur</EM></strong></font> <font color="#0066ff" size="4">pour</font> les <font color="#ff3399">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('');">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

  14. #14
    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
    Bonsoir Patrick,

    Voici une petite astuce pour alléger ton code. Il s’agit de mettre toutes tes références getElementById dans des variables que tu déclares au début de ton script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var oToto, oTiti;
     
    function execcom(a, couleur) {
      ...
    Et en bas de ta page, juste avant la balise de fermeture </body>, tu rajoutes une balise <script> dont le seul but est d’initialiser les variables :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ...
     
    <script type="text/javascript">
     
    oToto = document.getElementById("toto");
    oTiti = document.getElementById("titi");
     
    </script>
    </body>
    </html>

    Ensuite il ne te reste qu’à remplacer toutes les autres occurences de document.getElementById("...") dans ton code par la variable qui va bien.


    De manière générale, c’est un bon réflexe de créer une variable dès qu’il y a un truc que tu utilises plusieurs fois. Si tu choisis bien les noms des variables, ça te permet en même temps d’ajouter de la lisibilité dans ton code sans mettre de commentaires.

    Par exemple le passage où tu appelles txt.split(milieu) plusieurs fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var splittedTxt = txt.split(milieu);
    droite = splittedTxt[1];
    gauche = splittedTxt[0];
    C’est des petits trucs qui ont l’air tout bêtes comme ça, mais mis ensemble, ils font la différence.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  15. #15
    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
    oui c'est vrai watilin j'ai pourtant ce reflexe en vb pas encore en js j'ai encore besoins de pouvoir lire un chat est un chat surtout quand le code commence a faire 1000 lignes

    je vais regarder ca
    je progresse doucement

    tu a essayé? voir si il y avais un raté dans la suppression des espaces ??
    merci pour le retour
    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

  16. #16
    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
    J’ai vu que les &nbsp; n’étaient pas supprimés…
    Je teste avec IE11, il y a peut-être une différence par rapport à ton environnement.

    Sinon, j’ai remarqué un truc amusant : quand je clique sur le bouton « nocouleur », le texte sélectionné devient rose, et en-dessous je vois le code couleur #fa00e. Je me suis demandé d’où pouvait venir ce code, et puis j’ai compris : c’est le 'false' passé en paramètre qui est interprété comme une valeur hexadécimale. Le l et le s sont remplacés par des 0 car ce ne sont pas des chiffres hexadécimaux valides.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  17. #17
    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
    oui ce bouton je ne l'ai pas enlevé
    il faut que je trouve le code pour supprimer la couleur le execCommand("removeformat",false,"ForeColor")dans IE supprime tout le formatage

    il faudra donc que je passe par du code un moindre mal sur ce coup la

    etonnant quand meme mais je crois me souvenir que fragment fonctionne mal su firefox
    sinon IE 11 c'est nikel chez moi sauf le visuel si je clique direct sur un bouton couleur mais le boulot est fait
    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

  18. #18
    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
    Ah, je crois que j’ai trouvé le problème !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function execcom(a, couleur) {
        clearSpaceRange;
     
        ...
    Il manque les parenthèses d’appel à clearSpaceRange (ça ne génère pas d’erreur). Est-ce juste un problème de recopie sur ce forum ?
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  19. #19
    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
    et non c'est pas une erreur chez moi avec les parentheses la fonction ne fait rien je supose qu'elle doit planter j'ai pas mis un console.log
    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

  20. #20
    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
    C’est un problème de casse (majuscule/minuscule) avec getrange vers la fin de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      var range = getRange() // on reprend le range modifié que j'ai gardé actif
    Je suggère une recherche sensible à la casse avec ton éditeur de texte.

    Sous IE, quand la console est ouverte, il passe automatiquement en mode debug dès qu’il y a une erreur. Je ne t’oblige à rien, mais je te recommande chaudement de faire au moins une partie de tes tests sous le navigateur avant d’incorporer ton script dans ton environnement qui n’a pas d’outils de debug.

    Edit: encore plus efficace en fait, colle ton script sur JSHint.com et il va te dire tout de suite les variables non déclarées, non existantes, et même celles qui ne sont pas utilisées ! Et bien sûr il tient compte de la casse.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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