Saya ingin mendapatkan semua simpul teks turunan dari elemen, sebagai koleksi jQuery. Apa cara terbaik untuk melakukannya?
sumber
Saya ingin mendapatkan semua simpul teks turunan dari elemen, sebagai koleksi jQuery. Apa cara terbaik untuk melakukannya?
jQuery tidak memiliki fungsi yang mudah untuk ini. Anda perlu menggabungkan contents()
, yang akan memberikan simpul anak saja tetapi termasuk simpul teks, dengan find()
, yang memberikan semua elemen turunan tetapi tidak ada simpul teks. Inilah yang saya buat:
var getTextNodesIn = function(el) {
return $(el).find(":not(iframe)").addBack().contents().filter(function() {
return this.nodeType == 3;
});
};
getTextNodesIn(el);
Catatan: Jika Anda menggunakan jQuery 1.7 atau yang lebih lama, kode di atas tidak akan berfungsi. Untuk memperbaiki ini, ganti addBack()
dengan andSelf()
. andSelf()
tidak digunakan lagi addBack()
sejak 1,8 dan seterusnya.
Ini agak tidak efisien dibandingkan dengan metode DOM murni dan harus menyertakan solusi buruk untuk kelebihan contents()
fungsi jQuery (berkat @rabidsnail dalam komentar untuk menunjukkan hal itu), jadi di sini adalah solusi non-jQuery menggunakan fungsi rekursif sederhana. The includeWhitespaceNodes
kontrol parameter apakah atau tidak node teks spasi termasuk dalam output (di jQuery mereka secara otomatis disaring).
Pembaruan: Fixed bug ketika includeWhitespaceNodes palsu
function getTextNodesIn(node, includeWhitespaceNodes) {
var textNodes = [], nonWhitespaceMatcher = /\S/;
function getTextNodes(node) {
if (node.nodeType == 3) {
if (includeWhitespaceNodes || nonWhitespaceMatcher.test(node.nodeValue)) {
textNodes.push(node);
}
} else {
for (var i = 0, len = node.childNodes.length; i < len; ++i) {
getTextNodes(node.childNodes[i]);
}
}
}
getTextNodes(node);
return textNodes;
}
getTextNodesIn(el);
document.getElementById()
dulu, kalau itu yang Anda maksud:var div = document.getElementById("foo"); var textNodes = getTextNodesIn(div);
.contents()
lagian menyiratkan itu akan mencari melalui iframe juga. Saya tidak melihat bagaimana itu bisa menjadi bug.Jauco memposting solusi yang baik dalam komentar, jadi saya menyalinnya di sini:
sumber
sumber
jQuery.contents()
dapat digunakan denganjQuery.filter
untuk menemukan semua simpul teks anak. Dengan sedikit sentuhan, Anda dapat menemukan simpul teks cucu juga. Tidak diperlukan rekursi:jsFiddle
sumber
Saya mendapatkan banyak node teks kosong dengan fungsi filter yang diterima. Jika Anda hanya tertarik untuk memilih node teks yang mengandung non-spasi putih, coba tambahkan
nodeValue
persyaratan untukfilter
fungsi Anda , seperti sederhana$.trim(this.nodevalue) !== ''
:http://jsfiddle.net/ptp6m97v/
Atau untuk menghindari situasi aneh di mana konten terlihat seperti spasi, tetapi tidak (misalnya
­
karakter tanda hubung lunak , baris baru\n
, tab, dll.), Anda dapat mencoba menggunakan Ekspresi Reguler. Misalnya,\S
akan cocok dengan karakter non-spasi putih:sumber
Jika Anda dapat membuat asumsi bahwa semua anak adalah Element Nodes atau Text Nodes, maka ini adalah salah satu solusinya.
Untuk mendapatkan semua simpul teks anak sebagai koleksi jquery:
Untuk mendapatkan salinan elemen asli dengan anak-anak non-teks dihapus:
sumber
Untuk beberapa alasan
contents()
tidak bekerja untuk saya, jadi jika itu tidak berhasil untuk Anda, inilah solusi yang saya buat, saya buatjQuery.fn.descendants
dengan opsi untuk memasukkan node teks atau tidakPemakaian
Dapatkan semua keturunan termasuk simpul teks dan simpul elemen
Dapatkan semua keturunan hanya mengembalikan node teks
Dapatkan semua keturunan hanya mengembalikan node elemen
Coffeescript Asli :
Jatuhkan Versi Javascript
Ini adalah browser silang,
Array.indexOf
polyfill kecil termasuk dalam kode.sumber
Bisa juga dilakukan seperti ini:
Kode di atas menyaring textNodes dari anak-anak langsung node anak dari elemen yang diberikan.
sumber
jika Anda ingin menghapus semua tag, coba ini
fungsi:
pemakaian:
sumber
Bagi saya, old plain
.contents()
tampaknya berfungsi mengembalikan node teks, cukup hati-hati dengan pemilih Anda sehingga Anda tahu mereka akan menjadi node teks.Misalnya, ini membungkus semua konten teks dari TDs di meja saya dengan
pre
tag dan tidak memiliki masalah.sumber
Saya memiliki masalah yang sama dan menyelesaikannya dengan:
Kode:
Pemakaian:
Seperti
next()
tetapi juga mengembalikan node teks.sumber