2010-12-09 8 views
5

Compte tenu du HTML Fragment suivant:Comment trouver tous les nœuds de texte entre les nœuds d'éléments avec Javascript/JQuery?

<div> 
    <p> 
    abc <span id="x">[</span> def <br /> ghi 
    </p> 
    <p> 
    <strong> jkl <span id="y">]</span> mno </strong> 
    </p> 
</div> 

je besoin d'un algorithme pour chercher tous les noeuds de type texte entre #x et #y avec JavaScript. Ou y a-t-il une fonction JQuery qui fait exactement cela?

Les noeuds résultants de texte (noeuds blancs ignorés) pour l'exemple ci-dessus seraient alors:

['def', 'ghi', 'jkl'] 
+0

Souhaitez-vous récupérer les nœuds de texte ou leur contenu (chaîne)? –

+0

Notez également qu'il existe plus de trois nœuds de texte entre ces deux SPAN. (Je pense 5, mais je ne suis pas sûr) –

+0

@Sime: Je veux saisir les nœuds de texte. –

Répondre

7

Les travaux suivants dans tous les principaux navigateurs utilisant des méthodes DOM et aucune bibliothèque. Il ignore également les nœuds de texte d'espaces blancs mentionnés dans la question.

jsFiddle obligatoire: http://jsfiddle.net/timdown/a2Fm6/

function getTextNodesBetween(rootNode, startNode, endNode) { 
    var pastStartNode = false, reachedEndNode = false, textNodes = []; 

    function getTextNodes(node) { 
     if (node == startNode) { 
      pastStartNode = true; 
     } else if (node == endNode) { 
      reachedEndNode = true; 
     } else if (node.nodeType == 3) { 
      if (pastStartNode && !reachedEndNode && !/^\s*$/.test(node.nodeValue)) { 
       textNodes.push(node); 
      } 
     } else { 
      for (var i = 0, len = node.childNodes.length; !reachedEndNode && i < len; ++i) { 
       getTextNodes(node.childNodes[i]); 
      } 
     } 
    } 

    getTextNodes(rootNode); 
    return textNodes; 
} 

var x = document.getElementById("x"), 
    y = document.getElementById("y"); 

var textNodes = getTextNodesBetween(document.body, x, y); 
console.log(textNodes); 
+0

Au lieu de 'document.body', je pense que je peux utiliser le noeud parent commun du noeud de départ et du noeud final comme noeud racine. –

+0

@ user375773: En effet, je suis d'accord que ce serait mieux. J'ai omis cela pour des raisons de simplicité. –

0

L'exemple suivant utilise jQuery pour trouver deux éléments qui sont à côté de l'autre et peut ou non avoir des nœuds de texte entre eux. Cette boucle foreach va vérifier les éléments résultants pour trouver des nœuds de texte et les ajouter à la liste.

function getTextNodes() { 
    var list = []; 
    $(document.body).find("*+*").toArray().forEach(function (el) { 
     var prev = el.previousSibling; 
     while (prev != null && prev.nodeType == 3) { 
      list.push(prev); 
      prev = prev.previousSibling; 
     } 
    }); 
    return list; 
} 
Questions connexes