1. #1
    Expert éminent sénior
    Avatar de patricktoulon
    Profil pro
    Inscrit en
    avril 2009
    Messages
    10 525
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : avril 2009
    Messages : 10 525
    Points : 16 705
    Points
    16 705
    Billets dans le blog
    1

    Par défaut Identifier <P> parents d'une selection

    Bonjour a tous
    comment obtenir la balise "P" parent d'une sélection

    quand il n'y a pas de balise dans le P et que du texte le code qui suit donne"[object text]"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var sel = window.getSelection();
        var parent = sel.getRangeAt(0).commonAncestorContainer;
    merci pour le 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 : résolu: ça peut servir aux autres
    et n'oublie pas de voter

  2. #2
    Membre éprouvé Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    septembre 2002
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : septembre 2002
    Messages : 765
    Points : 1 208
    Points
    1 208

    Par défaut

    Salut,

    Essaie ça.

    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
     
    <script>
    function toto() {
       var range  = window.getSelection ();                                        
       var parent = range.anchorNode;
       while (parent != null) {
        if (parent.tagName == "P") {
       alert("Le contenu de la balise P = "+parent.innerHTML);
       return;
        } // if (parent.tagName != "P")
     
        var parent = parent.parentNode;
        if (parent.className == 'comment') {
          return;
        } // if (parent.className == 'comment')
     
       } // while (parent != null) 
    }
    </script>
        <div id="comment" class="comment" contenteditable onclick="operate();" onkeyup="operate();" onkeydown="operate();">
      <p><b><span>texte à sélectionner dans une balise p</span></b></p><br/>
      texte à sélectionner qui n'est pas dans une balise p
     </div>
        <br />
     <input type="button" id="t" value="Clic" onclick="toto()"/>
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  3. #3
    Expert éminent sénior
    Avatar de patricktoulon
    Profil pro
    Inscrit en
    avril 2009
    Messages
    10 525
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : avril 2009
    Messages : 10 525
    Points : 16 705
    Points
    16 705
    Billets dans le blog
    1

    Par défaut re

    Bonjour Badaze

    nikel donc pour moi se sera dans ma fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     var sel = window.getSelection();
        var parent = sel.getRangeAt(0).commonAncestorContainer;
    if(parent=="[object Text]"){parent=parent.parentNode;}
    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 : résolu: ça peut servir aux autres
    et n'oublie pas de voter

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : janvier 2011
    Messages : 11 939
    Points : 25 439
    Points
    25 439

    Par défaut

    Bonjour,
    je note que la St Patrick t'a été fatale

    Discussion du 04/03/2017, la tienne : Identifier le parent <P> d'une sélection de texte

  5. #5
    Expert éminent sénior
    Avatar de patricktoulon
    Profil pro
    Inscrit en
    avril 2009
    Messages
    10 525
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : avril 2009
    Messages : 10 525
    Points : 16 705
    Points
    16 705
    Billets dans le blog
    1

    Par défaut re

    bonjour noSmoking
    non pas du tout il s’avère que quand je n'ai que du texte sans balises parentElement ne marche pas et me donne "undefined"

    jusque a present je testais avec le texte balises ou pas dans un font globale enfant du "p"

    ca arrive aussi quand la sélection croise plusieurs balise selon le code innerhtml j'ai aussi "undefined"
    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 : résolu: ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : janvier 2011
    Messages : 11 939
    Points : 25 439
    Points
    25 439

    Par défaut

    C'est pourtant le même « combat », il te faut créer une fonction générique qui remonte l'arbre du DOM et ne pas multiplier les fonctions au coup par coup.

  7. #7
    Expert éminent sénior
    Avatar de patricktoulon
    Profil pro
    Inscrit en
    avril 2009
    Messages
    10 525
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : avril 2009
    Messages : 10 525
    Points : 16 705
    Points
    16 705
    Billets dans le blog
    1

    Par défaut re

    oui c'est vrai j'ai tendance a réécrire la même chose sur plusieurs fonctions au lieu d'en faire une générique
    appelée au besoins dans chaque fonctions quand cela est utile

    je procede comme ca pourtant en vba tres souvent avec des classes

    mais je n'ai pas encore suffisamment confiance en moi en JS pour jouer au aller retour dans les fonctions j'ai encore beaucoup de mal a trouver les erreur de syntaxe quand j'en 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 : résolu: ça peut servir aux autres
    et n'oublie pas de voter

  8. #8
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    octobre 2011
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : octobre 2011
    Messages : 931
    Points : 1 029
    Points
    1 029

    Par défaut

    Salut,

    Est-ce que [object text]" fonctionne dans tous les navigateurs et est plus générale que le nodeType égale à 3 ?

    Comme on parlais du nodeType ici : #3 je me demande si il y a une différence entre if(parent=="[object Text]") et if(parent.nodeType == 3) ?

  9. #9
    Modérateur

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

    Informations forums :
    Inscription : janvier 2011
    Messages : 11 939
    Points : 25 439
    Points
    25 439

    Par défaut

    Préfère, et de loin, la notation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (parent.nodeType === 3) {
    }

  10. #10
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    octobre 2011
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : octobre 2011
    Messages : 931
    Points : 1 029
    Points
    1 029

    Par défaut

    Merci. Oui c'est surtout cette notation que j'ai vu jusqu'à maintenant...

    Dans un code j'ai vu ce genre de test aussi : if (uneNode.firstChild), je crois que c'est aussi une manière de savoir si "uneNode" est ou n'est pas une nodeText...

  11. #11
    Expert éminent sénior
    Avatar de patricktoulon
    Profil pro
    Inscrit en
    avril 2009
    Messages
    10 525
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : avril 2009
    Messages : 10 525
    Points : 16 705
    Points
    16 705
    Billets dans le blog
    1

    Par défaut re

    j'ai adopté la notation
    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 : résolu: ça peut servir aux autres
    et n'oublie pas de voter

  12. #12
    Modérateur

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

    Informations forums :
    Inscription : janvier 2011
    Messages : 11 939
    Points : 25 439
    Points
    25 439

    Par défaut

    Dans un code j'ai vu ce genre de test aussi : if (uneNode.firstChild), je crois que c'est aussi une manière de savoir si "uneNode" est ou n'est pas une nodeText...
    cela signifie simplement que l'on teste si le noeud uneNode à un premier enfant, donc qu'il n'est pas « vide », d'enfant s'entend, mais cet enfant peut lui être vide.

  13. #13
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    octobre 2011
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : octobre 2011
    Messages : 931
    Points : 1 029
    Points
    1 029

    Par défaut

    Ah oui je n'ai pensé au cas où uneNode serait un élément vide... Donc en fait si uneNode n'a pas d'enfant cela signifie soit que c'est un élément vide soit que c'est une nodeText (car une nodeText n'a pas d'enfant)...

    En fait j'ai vu ça dans ces bouts de code (issu de l'exemple 4 de cette page : http://help.dottoro.com/ljcvtcaw.php) :

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (startContainer.firstChild) {
                                var startLeaf = startContainer.childNodes[startOffset];
                            }

    Et surtout ces deux fonctions l'une permet d'obtenir le prochain "leaf" et l'autre le "leaf" précédent :
    Code javascript : 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
            function GetNextLeaf (node) {
                while (!node.nextSibling) {
                    node = node.parentNode;
                    if (!node) {
                        return node;
                    }
                }
                var leaf = node.nextSibling;
                while (leaf.firstChild) {
                    leaf = leaf.firstChild;
                }
                return leaf;
            }
     
            function GetPreviousLeaf (node) {
                while (!node.previousSibling) {
                    node = node.parentNode;
                    if (!node) {
                        return node;
                    }
                }
                var leaf = node.previousSibling;
                while (leaf.lastChild) {
                    leaf = leaf.lastChild;
                }
                return leaf;
            }

    Et cette fonction aussi :
    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
     
     function ColorizeNode (node, color) {
                var childNode = node.firstChild;
                if (!childNode) {
                    ColorizeLeaf (node, color);
                    return;
                }
     
                while (childNode) {
                        // store the next sibling of the childNode, because colorizing modifies the DOM structure
                    var nextSibling = childNode.nextSibling;
                    ColorizeNode (childNode, color);
                    childNode = nextSibling;
                }
            }
    Il me semble bien qu'ils s'en servent pour savoir si la node est ou non une nodeText mais je ne sais pas si ils ont pensé au fait que cette node pourrait être un élément vide...

  14. #14
    Modérateur

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

    Informations forums :
    Inscription : janvier 2011
    Messages : 11 939
    Points : 25 439
    Points
    25 439

    Par défaut

    Donc en fait si uneNode n'a pas d'enfant cela signifie soit que c'est un élément vide soit que c'est une nodeText (car une nodeText n'a pas d'enfant)...
    oui c'est cela !
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <!-- noeud vide -->
    <span></span>
    <!-- noeud non vide -->
    <span>
    </span>

    Et surtout ces deux fonctions l'une permet d'obtenir le prochain "leaf" et l'autre le "leaf" précédent :
    Cela permet de descendre/monter rapidement l'arbre DOM.


    Il me semble bien qu'ils s'en servent pour savoir si la node est ou non une nodeText mais je ne sais pas si ils ont pensé au fait que cette node pourrait être un élément vide..
    il n'y a aucun intérêt à colorizer un noeud vide et il en tiennent compte.
    Citation Envoyé par le code
    // If the text content of an element contains white-spaces only, then does not need to colorize

  15. #15
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    octobre 2011
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : octobre 2011
    Messages : 931
    Points : 1 029
    Points
    1 029

    Par défaut

    Citation Envoyé par NoSmoking Voir le message
    il n'y a aucun intérêt à colorizer un noeud vide et il en tiennent compte.
    Ah oui bien vu ! Tu as l’œil... Effectivement ils en tiennent compte...

    Ben alors justement avec le teste sur le nodeType égale à trois on aurait pas besoin de la fonction IsTextVisible (text)...

    Citation Envoyé par NoSmoking Voir le message

    Cela permet de descendre/monter rapidement l'arbre DOM.
    Oui et cela dans le but d'obtenir le prochain "leaf" c'est-à-dire une nodeText mais en fait comme tu me l'as fait comprendre leur fonction renvoi soit une nodeText soit un élément vide...

    Et apparemment ils le savaient c'est pourquoi ils ont fait la fonction IsTextVisible (text)...


    EDIT : Ah non je viens de réaliser un truc, la fonction IsTextVisible (text) teste si le texte contient uniquement des "espaces blanc", elle ne vérifie pas si le texte est vide...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
              // If the text content of an element contains white-spaces only, then does not need to colorize
            function IsTextVisible (text) {
                for (var i = 0; i < text.length; i++) {
                    if (text[i] != ' ' && text[i] != '\t' && text[i] != '\r' && text[i] != '\n')
                        return true;
                }
                return false;
            }

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

Discussions similaires

  1. Identifier le parent <P> d'une sélection de texte
    Par patricktoulon dans le forum JavaScript
    Réponses: 1
    Dernier message: 04/03/2017, 05h44
  2. Réponses: 2
    Dernier message: 04/10/2005, 12h12
  3. ajout de colonnes sur une selection
    Par DaxTaz dans le forum MS SQL-Server
    Réponses: 4
    Dernier message: 05/08/2004, 18h44
  4. [C#]Sauvegarde d'une selection multiple d'une listbox?
    Par onouiri dans le forum ASP.NET
    Réponses: 7
    Dernier message: 29/04/2004, 18h16
  5. [Sybase] Select dans une select loop en C
    Par Claudio dans le forum Sybase
    Réponses: 2
    Dernier message: 29/04/2003, 19h06

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