Update 2018
Da dies eine sehr beliebte Antwort ist, habe ich beschlossen, sie ein wenig zu aktualisieren und zu verschönern, indem ich den Textknoten-Selektor als Plugin zu jQuery hinzufügte.
Im folgenden Snippet sehen Sie, dass ich eine neue jQuery-Funktion definiere, die alle (und nur) die textNodes abruft. Sie können diese Funktion auch mit beispielsweise der first()Funktion verketten. Ich schneide den Textknoten ab und überprüfe, ob er nach dem Zuschneiden nicht leer ist, da Leerzeichen, Tabulatoren, neue Zeilen usw. auch als Textknoten erkannt werden. Wenn Sie diese Knoten auch benötigen, entfernen Sie diese einfach aus der if-Anweisung in der jQuery-Funktion.
Ich habe ein Beispiel hinzugefügt, wie der erste Textknoten ersetzt wird und wie alle Textknoten ersetzt werden.
Dieser Ansatz erleichtert das Lesen des Codes und die mehrfache Verwendung für verschiedene Zwecke.
Das Update 2017 (adrach) sollte auch weiterhin funktionieren, wenn Sie dies bevorzugen.
Als jQuery-Erweiterung
//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>
Update 2017 (adrach):
Es sieht so aus, als hätten sich einige Dinge geändert, seit dies veröffentlicht wurde. Hier ist eine aktualisierte Version
$("div").contents().filter(function(){ return this.nodeType == 3; }).first().replaceWith("change text");
Ursprüngliche Antwort (funktioniert nicht für aktuelle Versionen)
$("div").contents().filter(function(){ return this.nodeType == 3; })
.filter(':first').text("change text");
Quelle: http://api.jquery.com/contents/