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.
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.
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
).
@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.
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.
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/
@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?)
Cela ne fonctionne pas comme le souhaite l'OP - cela obtiendra également le texte dans l'élément a
: jsfiddle.net/ekHJH
@James Allardice - J'ai terminé la solution jQuery maintenant cela fonctionnera .................
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/
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 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.
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