Mise à jour 2018
Comme il s'agit d'une réponse assez populaire, j'ai décidé de la mettre à jour et de l'embellir un peu en ajoutant le sélecteur de noeud de texte à jQuery en tant que plugin.
Dans l'extrait ci-dessous, vous pouvez voir que je définis une nouvelle fonction jQuery qui obtient tous (et uniquement) les textNodes. Vous pouvez également enchaîner cette fonction avec par exemple la first()
fonction. Je fais une découpe sur le nœud de texte et vérifie s'il n'est pas vide après la découpe car les espaces, les tabulations, les nouvelles lignes, etc. sont également reconnus comme des nœuds de texte. Si vous avez également besoin de ces nœuds, supprimez simplement cela de l'instruction if de la fonction jQuery.
J'ai ajouté un exemple comment remplacer le premier nœud de texte et comment remplacer tous les nœuds de texte.
Cette approche facilite la lecture du code et facilite son utilisation plusieurs fois et à des fins différentes.
La mise à jour 2017 (adrach) devrait toujours fonctionner aussi si vous préférez cela.
En tant qu'extension jQuery
//Add a jQuery extension so it can be used on any jQuery object
jQuery.fn.textNodes = function() {
return this.contents().filter(function() {
return (this.nodeType === Node.TEXT_NODE && this.nodeValue.trim() !== "");
});
}
//Use the jQuery extension
$(document).ready(function(){
$('#replaceAll').on('click', () => {
$('#testSubject').textNodes().replaceWith('Replaced');
});
$('#replaceFirst').on('click', () => {
$('#testSubject').textNodes().first().replaceWith('Replaced First');
});
});
p {
margin: 0px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="testSubject">
**text to change**
<p>text that should not change</p>
<p>text that should not change</p>
**also text to change**
<p>text that should not change</p>
<p>text that should not change</p>
**last text to change**
</div>
<button id="replaceFirst">Replace First</button>
<button id="replaceAll">Replace All</button>
Javascript (ES) eqivilant
//Add a new function to the HTMLElement object so it cna be used on any HTMLElement
HTMLElement.prototype.textNodes = function() {
return [...this.childNodes].filter((node) => {
return (node.nodeType === Node.TEXT_NODE && node.nodeValue.trim() !== "");
});
}
//Use the new HTMLElement function
document.addEventListener('DOMContentLoaded', () => {
document.querySelector('#replaceAll').addEventListener('click', () => {
document.querySelector('#testSubject').textNodes().forEach((node) => {
node.textContent = 'Replaced';
});
});
document.querySelector('#replaceFirst').addEventListener('click', function() {
document.querySelector('#testSubject').textNodes()[0].textContent = 'Replaced First';
});
});
p {
margin: 0px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="testSubject">
**text to change**
<p>text that should not change</p>
<p>text that should not change</p>
**also text to change**
<p>text that should not change</p>
<p>text that should not change</p>
**last text to change**
</div>
<button id="replaceFirst">Replace First</button>
<button id="replaceAll">Replace All</button>
Mise à jour 2017 (adrach):
Il semble que plusieurs choses aient changé depuis sa publication. Voici une version mise à jour
$("div").contents().filter(function(){ return this.nodeType == 3; }).first().replaceWith("change text");
Réponse originale (ne fonctionne pas pour les versions actuelles)
$("div").contents().filter(function(){ return this.nodeType == 3; })
.filter(':first').text("change text");
Source: http://api.jquery.com/contents/