Je voudrais obtenir tous les nœuds de texte descendants d'un élément, en tant que collection jQuery. Quelle est la meilleure façon de le faire?
la source
Je voudrais obtenir tous les nœuds de texte descendants d'un élément, en tant que collection jQuery. Quelle est la meilleure façon de le faire?
jQuery n'a pas de fonction pratique pour cela. Vous devez combiner contents()
, qui ne donnera que des nœuds enfants mais inclut des nœuds de texte, avec find()
, qui donne tous les éléments descendants mais pas de nœuds de texte. Voici ce que j'ai trouvé:
var getTextNodesIn = function(el) {
return $(el).find(":not(iframe)").addBack().contents().filter(function() {
return this.nodeType == 3;
});
};
getTextNodesIn(el);
Remarque: Si vous utilisez jQuery 1.7 ou une version antérieure, le code ci-dessus ne fonctionnera pas. Pour résoudre ce problème, remplacez addBack()
par andSelf()
. andSelf()
est déconseillé au profit de la version addBack()
1.8.
Ceci est quelque peu inefficace par rapport aux méthodes DOM pures et doit inclure une solution de contournement laide pour la surcharge de jQuery de sa contents()
fonction (grâce à @rabidsnail dans les commentaires pour l'avoir souligné), voici donc une solution non jQuery utilisant une simple fonction récursive. Le includeWhitespaceNodes
paramètre contrôle si les nœuds de texte d'espaces sont inclus ou non dans la sortie (dans jQuery, ils sont automatiquement filtrés).
Mise à jour: correction d'un bug lorsque includeWhitespaceNodes est faux.
function getTextNodesIn(node, includeWhitespaceNodes) {
var textNodes = [], nonWhitespaceMatcher = /\S/;
function getTextNodes(node) {
if (node.nodeType == 3) {
if (includeWhitespaceNodes || nonWhitespaceMatcher.test(node.nodeValue)) {
textNodes.push(node);
}
} else {
for (var i = 0, len = node.childNodes.length; i < len; ++i) {
getTextNodes(node.childNodes[i]);
}
}
}
getTextNodes(node);
return textNodes;
}
getTextNodesIn(el);
document.getElementById()
premier, si c'est ce que vous voulez dire:var div = document.getElementById("foo"); var textNodes = getTextNodesIn(div);
.contents()
toute façon implique également une recherche dans l'iframe. Je ne vois pas comment ça pourrait être un bug.Jauco a posté une bonne solution dans un commentaire, donc je la copie ici:
la source
la source
jQuery.contents()
peut être utilisé avecjQuery.filter
pour rechercher tous les nœuds de texte enfant. Avec une petite torsion, vous pouvez également trouver des nœuds de texte pour petits-enfants. Aucune récursivité requise:jsFiddle
la source
J'obtenais beaucoup de nœuds de texte vides avec la fonction de filtre acceptée. Si vous souhaitez uniquement sélectionner des nœuds de texte contenant des espaces non blancs, essayez d'ajouter un
nodeValue
conditionnel à votrefilter
fonction, comme un simple$.trim(this.nodevalue) !== ''
:http://jsfiddle.net/ptp6m97v/
Ou pour éviter des situations étranges où le contenu ressemble à un espace, mais ne l'est pas (par exemple le
­
caractère de trait d'union doux , les nouvelles lignes\n
, les tabulations, etc.), vous pouvez essayer d'utiliser une expression régulière. Par exemple,\S
correspondra à tous les caractères non blancs:la source
Si vous pouvez faire l'hypothèse que tous les enfants sont des nœuds d'élément ou des nœuds de texte, alors c'est une solution.
Pour obtenir tous les nœuds de texte enfant en tant que collection jquery:
Pour obtenir une copie de l'élément d'origine avec les enfants non textuels supprimés:
la source
Pour une raison quelconque, cela
contents()
n'a pas fonctionné pour moi, donc si cela n'a pas fonctionné pour vous, voici une solution que j'ai faite, j'ai crééjQuery.fn.descendants
avec l'option d'inclure ou non des nœuds de texteUsage
Obtenez tous les descendants, y compris les nœuds de texte et les nœuds d'élément
Obtenir tous les descendants renvoyant uniquement les nœuds de texte
Récupère tous les descendants renvoyant uniquement les nœuds d'élément
Coffeescript Original :
Déposer la version Javascript
Il s'agit d'un navigateur croisé, un petit
Array.indexOf
polyfill est inclus dans le code.la source
Peut aussi se faire comme ceci:
Le code ci-dessus filtre les textNodes des nœuds enfants enfants directs d'un élément donné.
la source
si vous souhaitez supprimer toutes les balises, essayez ceci
une fonction:
usage:
la source
Pour moi, tout simplement vieux
.contents()
semble fonctionner pour renvoyer les nœuds de texte, il suffit de faire attention à vos sélecteurs pour que vous sachiez qu'ils seront des nœuds de texte.Par exemple, cela a enveloppé tout le contenu textuel des TDs dans ma table avec
pre
balises et n'a eu aucun problème.la source
J'ai eu le même problème et l'ai résolu avec:
Code:
Usage:
Est similaire
next()
mais renvoie également les nœuds de texte.la source