Jika saya punya html seperti ini:
<li id="listItem">
This is some text
<span id="firstSpan">First span text</span>
<span id="secondSpan">Second span text</span>
</li>
Saya mencoba menggunakan .text()
untuk mengambil hanya string "Ini adalah beberapa teks", tetapi jika saya mengatakan $('#list-item').text()
, saya mendapatkan "Ini adalah beberapa textFirst span textSecond span text".
Apakah ada cara untuk mendapatkan (dan mungkin menghapus, melalui sesuatu seperti .text("")
) hanya teks gratis di dalam tag, dan bukan teks di dalam tag turunannya?
HTML tidak ditulis oleh saya, jadi ini yang harus saya kerjakan. Saya tahu itu akan mudah untuk hanya membungkus teks dalam tag saat menulis html, tetapi sekali lagi, html adalah pra-ditulis.
Jawaban:
Saya menyukai implementasi yang dapat digunakan kembali ini berdasarkan
clone()
metode yang ditemukan di sini untuk mendapatkan hanya teks di dalam elemen induk.Kode disediakan untuk referensi mudah:
sumber
Jawaban sederhana:
sumber
this.nodeType == Node.TEXT_NODE
bukanthis.nodeType == 3
. Lebih mudah membaca dan memahami IMO..contents().filter(...)
panggilan ke variabel lokal dan periksa panjangnya, misalnya,var text = $(this).contents().filter(...); if (text.length) { return text[0].nodeValue; } return "";
Ini sepertinya kasus jquery yang terlalu sering saya gunakan. Berikut ini akan mengambil teks mengabaikan node lain:
Anda harus memotongnya tetapi itu memberi Anda apa yang Anda inginkan dalam satu garis yang mudah.
EDIT
Di atas akan mendapatkan simpul teks . Untuk mendapatkan teks yang sebenarnya, gunakan ini:
sumber
$('.foo')[0].childNodes[0].nodeValue.trim()
document
. Datang ke sini menggunakancheerio
.Lebih mudah dan lebih cepat:
sumber
get(0)
bukannya adil[0]
?Mirip dengan jawaban yang diterima, tetapi tanpa kloning:
Dan ini adalah plugin jQuery untuk tujuan ini:
Berikut ini cara menggunakan plugin ini:
sumber
.contents()
ini sangat penting di sini!bukan kode:
hanya menjadi jQuery demi jQuery? Ketika operasi sederhana melibatkan banyak perintah dirantai & pemrosesan sebanyak itu (yang tidak perlu), mungkin sekarang saatnya untuk menulis ekstensi jQuery:
memanggil:
argumen dalam kasus skenario yang berbeda ditemui, seperti
teks akan memiliki nilai:
sumber
Coba ini:
sumber
Ini harus berupa sesuatu yang disesuaikan dengan kebutuhan, yang tergantung pada struktur yang Anda sajikan. Untuk contoh yang Anda berikan, ini berfungsi:
Demo: http://jquery.nodnod.net/cases/2385/run
Tapi itu cukup tergantung pada markup yang mirip dengan apa yang Anda posting.
sumber
clone
metode di sini jika itu bukan efek yang diinginkan..detach()
metode sebagai ganti.remove()
.Varian pendek dari jawaban Stuart.
atau dengan
get()
sumber
sumber
Ini adalah pertanyaan lama tetapi jawaban teratas sangat tidak efisien. Inilah solusi yang lebih baik:
Dan lakukan ini:
sumber
Saya kira ini akan menjadi solusi yang bagus juga - jika Anda ingin mendapatkan konten dari semua node teks yang merupakan anak-anak langsung dari elemen yang dipilih.
Catatan: Dokumentasi jQuery menggunakan kode serupa untuk menjelaskan fungsi konten: https://api.jquery.com/contents/
PS Ada juga cara yang sedikit lebih buruk untuk melakukan itu, tetapi ini menunjukkan lebih mendalam bagaimana hal-hal bekerja, dan memungkinkan untuk pemisah kustom antara node teks (mungkin Anda ingin jeda baris di sana)
sumber
Saya mengusulkan untuk menggunakan createTreeWalker untuk menemukan semua elemen teks yang tidak dilampirkan ke elemen html (fungsi ini dapat digunakan untuk memperluas jQuery):
sumber
Jika posisi
index
node teks diperbaiki di antara saudara kandungnya, Anda dapat menggunakansumber
Tidak yakin seberapa fleksibel atau berapa banyak kasus yang Anda butuhkan untuk dicakup, tetapi sebagai contoh, jika teks selalu muncul sebelum tag HTML pertama - mengapa tidak hanya membagi html bagian dalam pada tag pertama dan mengambil yang pertama:
dan jika Anda membutuhkannya lebih luas mungkin saja
dan jika Anda memerlukan teks di antara dua penanda, seperti setelah satu hal tetapi sebelum yang lain, Anda dapat melakukan sesuatu seperti (belum diuji) dan menggunakan pernyataan jika membuatnya cukup fleksibel untuk memiliki penanda awal atau akhir atau keduanya, sambil menghindari kesalahan ref nol :
Saya biasanya membuat fungsi utilitas untuk hal-hal berguna seperti ini, menjadikannya bebas kesalahan, dan kemudian mengandalkannya sesekali solid, daripada selalu menulis ulang jenis manipulasi string dan mempertaruhkan referensi nol dll. Dengan begitu, Anda dapat menggunakan kembali fungsi tersebut dalam banyak proyek dan tidak perlu membuang waktu lagi untuk debugging mengapa referensi string memiliki kesalahan referensi yang tidak ditentukan. Mungkin bukan kode baris 1 terpendek, tetapi setelah Anda memiliki fungsi utilitas, itu adalah satu baris sejak saat itu. Perhatikan sebagian besar kode hanya menangani parameter yang ada atau tidak untuk menghindari kesalahan :)
Sebagai contoh:
sumber
$('#listItem').html( newHTML )
; di mana newHTML adalah variabel yang sudah memiliki teks yang dilucuti.Ini cara yang baik untuk saya
sumber
Saya datang dengan solusi spesifik yang harus jauh lebih efisien daripada kloning dan memodifikasi klon. Solusi ini hanya berfungsi dengan dua reservasi berikut, tetapi harus lebih efisien daripada solusi yang saat ini diterima:
Dengan itu, inilah kodenya:
sumber
Sama seperti pertanyaan, saya mencoba untuk ekstrak teks untuk melakukan beberapa regex substitusi teks tetapi mendapatkan masalah di mana unsur-unsur batin saya (yaitu:
<i>
,<div>
,<span>
, dll) yang mendapatkan juga dihapus.Kode berikut tampaknya berfungsi dengan baik dan menyelesaikan semua masalah saya.
Ini menggunakan beberapa jawaban yang disediakan di sini tetapi khususnya, hanya akan menggantikan teks ketika elemen dari
nodeType === 3
.Apa yang dilakukan di atas adalah loop melalui semua elemen yang diberikan
el
(yang hanya diperoleh dengan$("div.my-class[name='some-name']");
. Untuk setiap elemen dalam, itu pada dasarnya mengabaikan mereka. Untuk setiap bagian teks (sebagaimana ditentukan olehif (this.nodeType === 3)
) itu akan menerapkan penggantian regex hanya untuk elemen-elemen tersebut. .The
this.textContent = text
porsi hanya menggantikan teks tersubstitusi, yang dalam kasus saya, saya sedang mencari token seperti[[min.val]]
,[[max.val]]
, dllKutipan kode pendek ini akan membantu siapa saja yang mencoba melakukan apa yang ditanyakan oleh pertanyaan ... dan sedikit lagi.
sumber
cukup letakkan di
<p>
atau<font>
dan ambil $ ('# font fontItem'). teks ()Hal pertama yang terlintas di benak saya
sumber
Anda bisa mencoba ini
sumber
Gunakan kondisi ekstra untuk memeriksa apakah innerHTML dan innerText sama. Hanya dalam kasus tersebut, ganti teks.
http://jsfiddle.net/7RSGh/
sumber
Agar dapat memangkas hasilnya, gunakan DotNetWala seperti:
Saya menemukan bahwa menggunakan versi yang lebih pendek seperti
document.getElementById("listItem").childNodes[0]
tidak akan berfungsi dengan trim jQuery ().sumber
document.getElementById("listItem").childNodes[0]
javascript biasa, Anda harus membungkusnya dalam fungsi jQuery$(document.getElementById("listItem").childNodes[0]).trim()
.trim()
ke bagian akhir. Apakah jawaban ini perlu?Saya bukan ahli jquery, tapi bagaimana,
sumber
Ini belum teruji, tetapi saya pikir Anda mungkin dapat mencoba sesuatu seperti ini:
http://api.jquery.com/not/
sumber
$('#listItem').text()
.#listItem
bukan<span>
jadi menambahkannot('span')
tidak melakukan apa-apa.