112 votes

Comment obtenir le nœud texte d'un élément?

   Je suis un noeud de texte
   Edit

Je souhaite obtenir le "Je suis un noeud de texte", ne souhaite pas supprimer la balise "edit", et avoir une solution compatible cross-browser.

0 votes

Cette question est pratiquement identique à stackoverflow.com/questions/3172166/… - consultez ces réponses pour une version JS simple de la réponse de James

91voto

James Allardice Points 81162
var texte = $(".title").contents().filter(function() {
  return this.nodeType == Node.TEXT_NODE;
}).text();

Cela récupère les contents de l'élément sélectionné, et lui applique une fonction de filtre. La fonction de filtre ne retourne que les noeuds texte (c'est-à-dire ceux avec nodeType == Node.TEXT_NODE).

0 votes

@Val - Désolé, j'ai oublié cela dans le code original. Je mettrai à jour la réponse pour l'afficher. Vous avez besoin de text() car la fonction filter renvoie les nœuds eux-mêmes, pas le contenu des nœuds.

1 votes

Pas sûr pourquoi mais je ne parviens pas à réussir à tester la théorie ci-dessus. J'ai exécuté le code suivant jQuery("*").each(function() { console.log(this.nodeType); }) et j'ai obtenu 1 pour tous les types de nœuds.

0 votes

Est-il possible d'obtenir le texte au nœud cliqué et le texte dans tous ses enfants?

63voto

Dogbert Points 44003

Vous pouvez obtenir la valeur du nodeValue du premier childNode en utilisant

$('.title')[0].childNodes[0].nodeValue

http://jsfiddle.net/TU4FB/

9 votes

Alors que cela fonctionnera, cela dépend de la position des nœuds enfants. Si cela change, cela cassera.

1 votes

Si le noeud texte n'est pas le premier enfant, vous pouvez obtenir null comme valeur de retour.

16voto

Shadow Wizard Points 38568

Si vous voulez obtenir la valeur du premier nœud de texte dans l'élément, ce code fonctionnera :

var oDiv = document.getElementById("MyDiv");
var firstText = "";
for (var i = 0; i < oDiv.childNodes.length; i++) {
    var curNode = oDiv.childNodes[i];
    if (curNode.nodeName === "#text") {
        firstText = curNode.nodeValue;
        break;
    }
}

Vous pouvez voir cela en action ici : http://jsfiddle.net/ZkjZJ/

0 votes

Je pense que vous pourriez utiliser curNode.nodeType == 3 au lieu de nodeName également.

1 votes

@Nilloc probablement, mais quel est le gain?

5 votes

@ShadowWizard @Nilloc recommande d'utiliser des constantes pour cela... curNode.nodeType == Node.TEXT_NODE (la comparaison numérique est plus rapide mais curNode.nodeType == 3 n'est pas lisible - quel noeud correspond au numéro 3?)

5voto

Pranay Rana Points 69934

.text() - pour jquery

$('.title').clone()    //cloner l'élément
.children() //sélectionner tous les enfants
.remove()   //supprimer tous les enfants
.end()  //retourner à l'élément sélectionné
.text();    //obtenir le texte de l'élément

1 votes

Je pense que la méthode pour JavaScript standard doit être 'innerText'

2 votes

Cela ne fonctionne pas comme le souhaite l'OP - cela obtiendra également le texte dans l'élément a : jsfiddle.net/ekHJH

1 votes

@James Allardice - J'ai terminé la solution jQuery maintenant cela fonctionnera .................

2voto

webx Points 31

Cela ignorera également les espaces, donc, vous n'avez jamais obtenu les nœuds de texte vides.. code utilisant JavaScript de base.

var oDiv = document.getElementById("MyDiv");
var firstText = "";
for (var i = 0; i < oDiv.childNodes.length; i++) {
    var curNode = oDiv.childNodes[i];
    whitespace = /^\s*$/;
    if (curNode.nodeName === "#text" && !(whitespace.test(curNode.nodeValue))) {
        firstText = curNode.nodeValue;
        break;
    }
}

Vérifiez sur jsfiddle : - http://jsfiddle.net/webx/ZhLep/

0 votes

curNode.nodeType === Node.TEXT_NODE serait préférable. Utiliser une comparaison de chaînes et une expression régulière dans une boucle est une solution de faible performance, surtout lorsque la magnitude de oDiv.childNodes.length augmente. Cet algorithme résout la question spécifique de l'OP, mais, potentiellement, à un coût de performance terrible. Si l'agencement, ou le nombre, des noeuds de texte change, alors cette solution ne peut pas garantir de retourner une sortie précise. En d'autres termes, vous ne pouvez pas cibler le noeud de texte exact que vous voulez. Vous êtes à la merci de la structure HTML et de l'agencement du texte qui s'y trouve.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X