Cập nhật 2018
Vì đây là một câu trả lời khá phổ biến nên tôi quyết định cập nhật và làm đẹp nó một chút bằng cách thêm công cụ chọn textnode vào jQuery làm plugin.
Trong đoạn mã bên dưới, bạn có thể thấy rằng tôi xác định một hàm jQuery mới nhận tất cả (và chỉ) các textNodes. Bạn cũng có thể xâu chuỗi hàm này với ví dụ như first()
hàm. Tôi thực hiện cắt trên nút văn bản và kiểm tra xem nó có trống không sau khi cắt vì dấu cách, tab, dòng mới, v.v. cũng được nhận dạng là nút văn bản. Nếu bạn cũng cần những nút đó thì chỉ cần xóa nó khỏi câu lệnh if trong hàm jQuery.
Tôi đã thêm một ví dụ về cách thay thế nút văn bản đầu tiên và cách thay thế tất cả các nút văn bản.
Cách tiếp cận này giúp bạn đọc mã dễ dàng hơn và dễ dàng sử dụng nó nhiều lần với các mục đích khác nhau.
Bản cập nhật 2017 (adrach) vẫn sẽ hoạt động tốt nếu bạn thích điều đó.
Dưới dạng phần mở rộng 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>
Cập nhật 2017 (adrach):
Có vẻ như một số thứ đã thay đổi kể từ khi điều này được đăng. Đây là một phiên bản cập nhật
$("div").contents().filter(function(){ return this.nodeType == 3; }).first().replaceWith("change text");
Câu trả lời gốc (Không hoạt động cho các phiên bản hiện tại)
$("div").contents().filter(function(){ return this.nodeType == 3; })
.filter(':first').text("change text");
Nguồn: http://api.jquery.com/contents/