Bagaimana cara menemukan DIV dengan teks tertentu? Sebagai contoh:
<div>
SomeText, text continues.
</div>
Mencoba menggunakan sesuatu seperti ini:
var text = document.querySelector('div[SomeText*]').innerTEXT;
alert(text);
Tapi tentu saja itu tidak akan berhasil. Bagaimana saya bisa melakukannya?
javascript
innertext
selectors-api
passwd
sumber
sumber
Jawaban:
Pertanyaan OP adalah tentang JavaScript biasa dan bukan jQuery . Meskipun ada banyak jawaban dan saya suka jawaban @Pawan Nogariya , silakan lihat alternatif ini.
Anda dapat menggunakan XPATH di JavaScript. Info lebih lanjut tentang artikel MDN di sini .
The
document.evaluate()
Metode mengevaluasi sebuah XPath permintaan / ekspresi. Jadi Anda bisa melewatkan ekspresi XPATH di sana, melintasi ke dalam dokumen HTML dan menemukan elemen yang diinginkan.Di XPATH Anda dapat memilih elemen, dengan simpul teks seperti berikut, yang mendapatkan
div
simpul teks berikut.Untuk mendapatkan elemen yang berisi beberapa teks, gunakan yang berikut ini:
The
contains()
metode dalam XPath mengambil simpul sebagai parameter pertama dan teks untuk mencari sebagai parameter kedua.Periksa plunk ini di sini , ini adalah contoh penggunaan XPATH di JavaScript
Berikut ini cuplikan kode:
Seperti yang Anda lihat, saya dapat mengambil elemen HTML dan memodifikasinya sesuka saya.
sumber
alert(thisHeading.textContent.replace(/.*You have login (.*) times.*/,'$1')) ;
.evaluate()
menggunakan. Mohon koreksi seseorang jika saya salah), jadi pertama-tama, Anda tidak dapat mencari sesuatu yang cocok dengan ekspresi reguler. Kedua,.textContent
properti mengembalikan simpul teks dari elemen. Jika Anda ingin mengambil nilai dari teks ini, Anda harus menanganinya secara eksplisit, mungkin dengan membuat semacam fungsi yang cocok dengan regex dan mengembalikan nilai yang cocok dalam grup. Untuk itu buat pertanyaan baru di utas terpisah.Anda dapat menggunakan solusi yang cukup sederhana ini:
Ini
Array.from
akan mengonversi NodeList menjadi array (ada beberapa metode untuk melakukan ini seperti operator penyebaran atau irisan)Hasilnya sekarang menjadi sebuah array yang memungkinkan untuk menggunakan
Array.find
metode ini, Anda kemudian dapat memasukkan predikat apa pun. Anda juga bisa memeriksa textContent dengan regex atau apapun yang Anda suka.Perhatikan bahwa
Array.from
danArray.find
merupakan fitur ES2015. Ini kompatibel dengan browser lama seperti IE10 tanpa transpiler:sumber
find
denganfilter
.Karena Anda telah memintanya dalam javascript sehingga Anda dapat memiliki sesuatu seperti ini
Dan kemudian menyebutnya seperti ini
sumber
[object HTMLDivElement],[object HTMLDivElement]
foundDivs[0].innerText
, sesederhana ituSolusi ini melakukan hal berikut:
Menggunakan operator sebaran ES6 untuk mengonversi NodeList semua
div
s menjadi larik.Memberikan output jika
div
berisi string kueri, tidak hanya jika sama persis dengan string kueri (yang terjadi untuk beberapa jawaban lain). misalnya Ia harus memberikan keluaran tidak hanya untuk 'SomeText' tetapi juga untuk 'SomeText, teks berlanjut'.Menghasilkan seluruh
div
konten, bukan hanya string kueri. misalnya Untuk 'SomeText, teks berlanjut' itu harus menampilkan seluruh string, bukan hanya 'SomeText'.Memungkinkan beberapa
div
s untuk memuat string, bukan hanya satudiv
.sumber
innerHTML
top Anda<div>
. Anda harus memfilterdiv
s yang berisi turunan terlebih dahulu. Juga curigadocument.getElementsByTagName('div')
mungkin lebih cepat tapi saya akan patokan untuk memastikannya.Anda sebaiknya melihat apakah Anda memiliki elemen induk dari div yang Anda kueri. Jika demikian, dapatkan elemen induk dan lakukan
element.querySelectorAll("div")
. Setelah AndanodeList
menerapkan filter di atasnya di atasinnerText
properti. Asumsikan bahwa elemen induk dari div yang kita kueri memilikiid
daricontainer
. Anda biasanya dapat mengakses container langsung dari id tetapi mari kita lakukan dengan cara yang benar.Jadi begitu.
sumber
Jika Anda tidak ingin menggunakan jquery atau semacamnya, Anda dapat mencoba ini:
Setelah Anda memiliki node dalam array yang berisi teks, Anda dapat melakukan sesuatu dengannya. Seperti mengingatkan masing-masing atau mencetak ke konsol. Satu peringatan adalah bahwa ini belum tentu mengambil div sendiri, ini akan mengambil induk dari textnode yang memiliki teks yang Anda cari.
sumber
Karena tidak ada batasan panjang teks dalam atribut data, gunakan atribut data! Dan kemudian Anda dapat menggunakan pemilih css biasa untuk memilih elemen Anda seperti yang diinginkan OP.
Idealnya Anda melakukan bagian pengaturan atribut data pada pemuatan dokumen dan mempersempit pemilih querySelectorAll sedikit untuk kinerja.
sumber
Google memiliki ini sebagai hasil teratas untuk mereka yang perlu menemukan node dengan teks tertentu. Melalui pembaruan, nodelist sekarang dapat di-iterable di browser modern tanpa harus mengubahnya menjadi array.
Solusinya bisa menggunakan forEach seperti itu.
Ini bekerja bagi saya untuk melakukan pencarian / penggantian teks di dalam nodelist ketika pemilih normal tidak dapat memilih hanya satu node jadi saya harus memfilter setiap node satu per satu untuk memeriksa jarumnya.
sumber
Gunakan XPath dan document.evaluate (), dan pastikan untuk menggunakan text () dan bukan. untuk argumen berisi (), atau Anda akan memiliki seluruh HTML, atau elemen div terluar yang cocok.
atau abaikan spasi di depan dan di belakangnya
atau cocokkan semua jenis tag (div, h1, p, dll.)
Kemudian lakukan iterasi
sumber
thisheading.setAttribute('class', "esubject")
Berikut pendekatan XPath tetapi dengan minimal jargon XPath.
Seleksi reguler berdasarkan nilai atribut elemen (untuk perbandingan):
Pemilihan XPath berdasarkan teks dalam elemen.
Dan berikut ini dengan case-insensitivity karena teks lebih mudah menguap:
sumber
Saya memiliki masalah yang sama.
Fungsi yang mengembalikan semua elemen yang menyertakan teks dari arg.
Ini bekerja untuk saya:
}
sumber
Sudah ada banyak solusi hebat di sini. Namun, untuk memberikan solusi yang lebih efisien dan satu lagi sesuai dengan gagasan perilaku querySelector dan sintaks, saya memilih solusi yang memperluas Object dengan beberapa fungsi prototipe. Kedua fungsi ini menggunakan ekspresi reguler untuk mencocokkan teks, namun, string dapat disediakan sebagai parameter pencarian longgar.
Cukup terapkan fungsi berikut:
Dengan penerapan fungsi ini, Anda sekarang dapat melakukan panggilan sebagai berikut:
document.queryInnerTextAll('div.link', 'go');
Ini akan menemukan semua divs yang berisi link yang kelas dengan kata pergi di innerText (misalnya. Go Kiri atau GO bawah atau ke kanan atau Hal ini Go od )
document.queryInnerText('div.link', 'go');
Ini akan bekerja persis seperti contoh di atas kecuali itu hanya akan mengembalikan elemen pertama yang cocok.
document.queryInnerTextAll('a', /^Next$/);
Temukan semua tautan dengan teks persis Berikutnya (peka huruf besar-kecil). Ini akan mengecualikan link yang berisi kata Next bersama dengan teks lainnya.
document.queryInnerText('a', /next/i);
Temukan tautan pertama yang berisi kata berikutnya , terlepas dari kasusnya (mis. Halaman Berikutnya atau Ke berikutnya )
e = document.querySelector('#page');
e.queryInnerText('button', /Continue/);
Ini melakukan pencarian dalam elemen wadah untuk tombol yang berisi teks, Lanjutkan (peka huruf besar-kecil). (mis. Lanjutkan atau Lanjutkan ke Berikutnya tetapi tidak melanjutkan )
sumber