Update 2018
Da dies eine ziemlich beliebte Antwort ist, habe ich beschlossen, sie zu aktualisieren und ein wenig zu verschönern, indem ich den Textnode-Selektor als Plugin zu jQuery hinzufüge.
In dem Schnipsel unten können Sie sehen, dass ich eine neue jQuery-Funktion, die alle (und nur) die textNodes bekommt definieren. Sie können diese Funktion auch verketten, zum Beispiel mit der first()
Funktion. Ich beschneide den Textknoten und prüfe, ob er nach dem Beschneiden nicht leer ist, da Leerzeichen, Tabulatoren, neue Zeilen usw. ebenfalls als Textknoten erkannt werden. Wenn Sie diese Knoten auch benötigen, entfernen Sie sie einfach aus der if-Anweisung in der jQuery-Funktion.
Ich habe ein Beispiel hinzugefügt, wie man den ersten Textknoten ersetzt und wie man alle Textknoten ersetzt.
Dieser Ansatz macht den Code leichter lesbar und erleichtert seine mehrfache Verwendung für unterschiedliche Zwecke.
El Update 2017 (adrach) sollte ebenfalls 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 seit der Veröffentlichung dieses Artikels einige Dinge geändert. 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");
出典 http://api.jquery.com/contents/