Si j'ai du HTML comme ça:
<li id="listItem">
This is some text
<span id="firstSpan">First span text</span>
<span id="secondSpan">Second span text</span>
</li>
J'essaie d'utiliser .text()
pour récupérer uniquement la chaîne "Ceci est du texte", mais si je devais dire $('#list-item').text()
, j'obtiens "Ceci est du texte.
Existe-t-il un moyen d'obtenir (et éventuellement de supprimer, via quelque chose comme .text("")
) juste le texte libre dans une balise, et non le texte dans ses balises enfants?
Le HTML n'a pas été écrit par moi, c'est donc ce avec quoi je dois travailler. Je sais qu'il serait simple de simplement envelopper le texte dans des balises lors de l'écriture du HTML, mais encore une fois, le HTML est pré-écrit.
Réponses:
J'ai aimé cette implémentation réutilisable basée sur la
clone()
méthode trouvée ici pour obtenir uniquement le texte à l'intérieur de l'élément parent.Code fourni pour référence facile:
la source
Réponse simple:
la source
this.nodeType == Node.TEXT_NODE
place dethis.nodeType == 3
. Plus facile à lire et à comprendre l'OMI..contents().filter(...)
appel dans une variable locale et vérifiez sa longueur, par exemple,var text = $(this).contents().filter(...); if (text.length) { return text[0].nodeValue; } return "";
Cela me semble être un cas d'utilisation excessive de jquery. Les éléments suivants saisiront le texte en ignorant les autres nœuds:
Vous aurez besoin de couper cela, mais cela vous donne ce que vous voulez en une seule ligne facile.
ÉDITER
Ce qui précède obtiendra le nœud de texte . Pour obtenir le texte réel, utilisez ceci:
la source
$('.foo')[0].childNodes[0].nodeValue.trim()
document
. Entré ici en utilisantcheerio
.Plus simple et plus rapide:
la source
get(0)
au lieu de juste[0]
?Similaire à la réponse acceptée, mais sans clonage:
Et voici un plugin jQuery à cet effet:
Voici comment utiliser ce plugin:
la source
.contents()
partie est critique ici!n'est pas le code:
devenir juste jQuery pour l'amour de jQuery? Lorsque des opérations simples impliquent autant de commandes chaînées et autant de traitement (inutile), il est peut-être temps d'écrire une extension jQuery:
appeler:
les arguments sont dans le cas où un scénario différent est rencontré, tel que
le texte aura une valeur:
la source
Essaye ça:
la source
Il faudra que ce soit quelque chose adapté aux besoins, qui dépendent de la structure qui vous est présentée. Pour l'exemple que vous avez fourni, cela fonctionne:
Démo: http://jquery.nodnod.net/cases/2385/run
Mais cela dépend assez du balisage qui est similaire à ce que vous avez publié.
la source
clone
méthode ici si ce n'est pas l'effet recherché..detach()
méthode au lieu de.remove()
.Variante courte de la réponse de Stuart.
ou avec
get()
la source
la source
C'est une vieille question, mais la première réponse est très inefficace. Voici une meilleure solution:
Et faites ceci:
la source
Je suppose que ce serait également une bonne solution - si vous souhaitez obtenir le contenu de tous les nœuds de texte qui sont des enfants directs de l'élément sélectionné.
Remarque: la documentation jQuery utilise un code similaire pour expliquer la fonction de contenu: https://api.jquery.com/contents/
PS Il y a aussi un moyen un peu plus laid de le faire, mais cela montre plus en détail comment les choses fonctionnent et permet un séparateur personnalisé entre les nœuds de texte (peut-être que vous voulez un saut de ligne là-bas)
la source
Je propose d'utiliser le createTreeWalker pour trouver tous les éléments de texte non attachés aux éléments html (cette fonction peut être utilisée pour étendre jQuery):
la source
Si la position
index
du nœud de texte est fixe parmi ses frères et sœurs, vous pouvez utiliserla source
Je ne sais pas dans quelle mesure ou combien de cas vous devez couvrir, mais pour votre exemple, si le texte vient toujours avant les premières balises HTML - pourquoi ne pas simplement diviser le code HTML interne à la première balise et prendre la première:
et si vous en avez besoin plus large peut-être juste
et si vous avez besoin du texte entre deux marqueurs, comme après une chose mais avant une autre, vous pouvez faire quelque chose comme (non testé) et utiliser les instructions if pour le rendre suffisamment flexible pour avoir un marqueur de début ou de fin ou les deux, tout en évitant les erreurs de référence nulles :
Je crée généralement des fonctions utilitaires pour des choses utiles comme celle-ci, les rend exemptes d'erreurs, puis je les utilise souvent une fois solides, plutôt que de toujours réécrire ce type de manipulation de chaînes et risquer les références nulles, etc. De cette façon, vous pouvez réutiliser la fonction dans de nombreux projets et ne plus jamais y perdre de temps à déboguer pourquoi une référence de chaîne a une erreur de référence non définie. Ce n'est peut-être pas le code 1 ligne le plus court jamais créé, mais une fois que vous avez la fonction utilitaire, il ne s'agit plus que d'une ligne. Notez que la plupart du code gère simplement les paramètres présents ou non pour éviter les erreurs :)
Par exemple:
la source
$('#listItem').html( newHTML )
; où newHTML est une variable qui a déjà le texte supprimé.C'est un bon moyen pour moi
la source
J'ai trouvé une solution spécifique qui devrait être beaucoup plus efficace que le clonage et la modification du clone. Cette solution ne fonctionne qu'avec les deux réserves suivantes, mais devrait être plus efficace que la solution actuellement acceptée:
Cela dit, voici le code:
la source
Tout comme la question, je tentais de texte extrait afin de faire une substitution regex du texte , mais devenais problèmes où mes éléments internes (ex:
<i>
,<div>
,<span>
, etc.) ont été enlevés également obtenir.Le code suivant semble bien fonctionner et a résolu tous mes problèmes.
Il utilise certaines des réponses fournies ici mais en particulier, ne remplacera le texte que lorsque l'élément est de
nodeType === 3
.Ce qui précède consiste à parcourir tous les éléments du donné
el
(qui a été simplement obtenu avec$("div.my-class[name='some-name']");
. Pour chaque élément interne, il les ignore fondamentalement. Pour chaque partie de texte (comme déterminé parif (this.nodeType === 3)
), il appliquera la substitution d'expression régulière uniquement à ces éléments .La
this.textContent = text
partie remplace simplement le texte substitutif, qui dans mon cas, je cherchais des jetons comme[[min.val]]
,[[max.val]]
, etc.Cet extrait de code court aidera quiconque essaie de faire ce que la question demandait ... et un peu plus.
la source
il suffit de le mettre dans un
<p>
ou<font>
et de saisir cette $ ('# listItem font'). text ()La première chose qui m'est venue à l'esprit
la source
Vous pouvez essayer ceci
la source
Utilisez une condition supplémentaire pour vérifier si innerHTML et innerText sont identiques. Seulement dans ces cas, remplacez le texte.
http://jsfiddle.net/7RSGh/
la source
Pour pouvoir rogner le résultat, utilisez le DotNetWala comme ceci:
J'ai découvert que l'utilisation de la version plus courte comme
document.getElementById("listItem").childNodes[0]
ne fonctionnerait pas avec jQuery trim ().la source
document.getElementById("listItem").childNodes[0]
c'est du javascript simple, vous devez l'envelopper dans la fonction jQuery$(document.getElementById("listItem").childNodes[0]).trim()
.trim()
à la fin. Cette réponse est-elle nécessaire?Je ne suis pas un expert jquery, mais que diriez-vous,
la source
Cela n'a pas été testé, mais je pense que vous pourrez peut-être essayer quelque chose comme ceci:
http://api.jquery.com/not/
la source
$('#listItem').text()
.#listItem
n'est pas un<span>
ajoutnot('span')
donc ne fait rien.