jQuery remplace le texte en laissant les frères et soeurs intacts

J’ai du mal à comprendre ce qui devrait être une solution simple. Je souhaite remplacer le texte dans une étiquette, sans affecter les autres «frères et soeurs», s’ils existent

Échantillon de balisage:

Sample Fieldset

Objectif:

  • Pour remplacer le texte Some Label X par Some Label (Ie supprime X du texte de l’étiquette).
  • Les balises span de l’étiquette doivent restr intactes, par exemple ci-dessus.
  • Je ne connais pas la valeur de X , qui pourrait comporter un ou plusieurs caractères.

Script actuel:

Mon script jQuery ci-dessous fonctionne, mais je sais que c’est très inefficace. Je n’arrive pas à comprendre ce que je pense pour une raison quelconque …

 //for each label in the fieldset that contains text "Some Label " $(".myFieldsetClass label:contains('Some Label ')").each(function() { if ($(this).has("span").length > 0) { //if the label has the span tag within, remove it and prepend it back to the replaced text $(this).find("span").remove().prependTo($(this).text(labelText)); } else { //otherwise just replace the text $(this).text('Some Label'); } }); 

J’ai d’abord pensé pouvoir faire:

 $(".myFieldsetClass label:contains('Some Label ')").text("Some Label"); 

Mais cela efface tout le contenu de l’étiquette et par conséquent supprime la durée, ce que je ne veux pas. Je ne peux utiliser aucune fonction de remplacement pour remplacer Some Label X par Some Label car je ne sais pas ce que sera X

Quelqu’un peut-il suggérer une approche plus élégante / efficace de ce problème?

Merci.

MODIFIER

Après avoir essayé plusieurs réponses, je pense que le problème semble être que même si je sélectionne la bonne collection, il s’agit de nœuds de texte que jquery ne semble pas vouloir modifier. J’ai utilisé FireBug pour sélectionner la collection (plusieurs réponses). en dessous de tous sélectionner correctement mais de manière légèrement différente). Dans la console firebug, le résultat est:

 [, , , , ] 

Le problème semble être que l’appel à .replaceWith (), .replace (), .text (), etc. ne semble pas affecter la collection jQuery. Si j’autorise la collection ci-dessus à contenir l’une des plages, l’appel de .replaceWith (), .replace (), etc. fonctionne correctement sur cette plage, mais les nœuds de texte restnt tels quels.

Essayer:

 $(".myFieldsetClass label:contains('Some Label ')").contents().filter(':last-child').text("Some Label"); 

Cela devrait fonctionner en supposant que le texte à remplacer sera toujours à la fin. La fonction contents() sélectionne tous les nœuds, y compris les nœuds de texte.

http://api.jquery.com/contents/

EDIT: J’aurais dû utiliser filter () au lieu de find (). Corrigée.

EDIT: Fonctionne maintenant. Voici un moyen.

 // Store proper labels in a variable for quick and accurate reference var $labelCollection = $(".myFieldsetClass label:contains('Some Label ')"); // Call contents(), grab the last one and remove() it $labelCollection.each(function() { $(this).contents().last().remove() }); // Then simply append() to the label whatever text you wanted. $labelCollection.append('some text') 

Comme Pasortingck le fait remarquer, vous pouvez utiliser contents() pour sélectionner le texte seul, puis le remplacer. En adaptant l’exemple donné ici, vous pouvez également essayer:

 $(".myFieldsetClass label:contains('Some Label ')").contents().filter(function() { return this.nodeType == 3 && $(this).is(":contains('Some Label ')"); }) .replaceWith("Some Label"); 

Cependant, si vous savez que “Some Label” sera toujours le dernier élément de la méthode de Pasortingck sera plus rapide, je crois.

Pourquoi ne pas simplement faire un remplacement complet en utilisant regex?

 $(".myFieldsetClass label:contains('Some Label ')") .each(function() { $(this).html($(this).html().replace(/Some Label ./, "Some Label")); }); 

Un one-liner:

 $('.myFieldsetClass label').contents().last().remove().end().first().after('New Label')