Saya memiliki koleksi elemen blok pada halaman. Mereka semua memiliki aturan CSS white-space, overflow, set teks-overflow sehingga teks yang meluap dipangkas dan elipsis digunakan.
Namun, tidak semua elemen meluap.
Adakah saya bisa menggunakan javascript untuk mendeteksi elemen mana yang meluap?
Terima kasih.
Ditambahkan: contoh struktur HTML yang saya kerjakan.
<td><span>Normal text</span></td>
<td><span>Long text that will be trimmed text</span></td>
Elemen SPAN selalu muat di dalam sel, mereka memiliki aturan elips yang diterapkan. Saya ingin mendeteksi kapan elipsis diterapkan ke konten teks SPAN.
javascript
html
css
ellipsis
deanoj
sumber
sumber
Jawaban:
Sekali waktu saya perlu melakukan ini, dan satu-satunya solusi yang dapat diandalkan lintas-browser saya temui adalah pekerjaan hack. Saya bukan penggemar solusi terbesar seperti ini, tetapi tentu saja menghasilkan hasil yang benar berulang kali.
Idenya adalah Anda mengkloning elemen, menghapus lebar ikatan apa pun, dan menguji apakah elemen yang dikloning lebih lebar dari aslinya. Jika demikian, Anda tahu itu akan terpotong.
Misalnya, menggunakan jQuery:
Saya membuat jsFiddle untuk mendemonstrasikan ini, http://jsfiddle.net/cgzW8/2/
Anda bahkan dapat membuat pemilih-semu kustom Anda sendiri untuk jQuery:
Kemudian gunakan untuk menemukan elemen
Demo: http://jsfiddle.net/cgzW8/293/
Semoga ini bisa membantu, hacky apa adanya.
sumber
white-space: nowrap
.Coba fungsi JS ini, dengan meneruskan elemen span sebagai argumen:
sumber
text-overflow:ellipsis
atasnya haruse.offsetWidth <= e.scrollWidth
Menambahkan ke jawaban italo, Anda juga dapat melakukan ini menggunakan jQuery.
Juga, seperti yang ditunjukkan Smoky, Anda mungkin ingin menggunakan jQuery outerWidth () alih-alih lebar ().
sumber
Bagi mereka yang menggunakan (atau berencana untuk menggunakan) jawaban yang diterima dari Christian Varga, harap ketahui masalah kinerja.
Kloning / memanipulasi DOM sedemikian rupa menyebabkan DOM Reflow (lihat penjelasan tentang DOM reflow di sini) yang sangat intensif sumber daya.
Menggunakan solusi Christian Varga pada 100+ elemen pada halaman menyebabkan penundaan reflow selama 4 detik di mana utas JS dikunci. Mengingat JS adalah single-threaded, ini berarti penundaan UX yang signifikan bagi pengguna akhir.
Italo Borssatto ini jawabannya harus menjadi salah satu yang diterima, itu kira-kira 10 kali lebih cepat selama profiling saya.
sumber
mouseenter
untuk melihat apakah tooltip perlu ditampilkan.Jawaban dari italo sangat bagus! Namun izinkan saya sedikit memperbaikinya:
Kompatibilitas lintas browser
Jika, pada kenyataannya, Anda mencoba kode di atas dan menggunakannya
console.log
untuk mencetak nilai-nilaie.offsetWidth
dane.scrollWidth
, Anda akan melihat, di IE, bahwa, bahkan ketika Anda tidak memiliki pemotongan teks, perbedaan nilai1px
atau2px
dialami.Jadi, tergantung pada ukuran font yang Anda gunakan, izinkan toleransi tertentu!
sumber
elem.offsetWdith VS ele.scrollWidth Ini bekerja untuk saya! https://jsfiddle.net/gustavojuan/210to9p1/
sumber
Sampel ini menunjukkan tooltip pada tabel sel dengan teks terpotong. Dinamis berdasarkan lebar tabel:
Demo: https://jsfiddle.net/t4qs3tqs/
Ini bekerja pada semua versi jQuery
sumber
Saya pikir cara yang lebih baik untuk mendeteksinya adalah menggunakan
getClientRects()
, tampaknya setiap kotak memiliki tinggi yang sama, sehingga kita dapat menghitung angka garis dengan jumlahtop
nilai yang berbeda .getClientRects
bekerja seperti inigetRowRects
bekerja seperti iniAnda dapat mendeteksi seperti ini
sumber
Semua solusi yang tidak benar-benar bekerja untuk saya, apa yang lakukan pekerjaan yang membandingkan elemen
scrollWidth
kescrollWidth
induknya (atau anak, tergantung pada elemen memiliki pemicu).Ketika anak
scrollWidth
lebih tinggi dari orang tuanya, itu berarti.text-ellipsis
aktif.Kapan
event
elemen indukKapan
event
elemen anaksumber
Itu
e.offsetWidth < e.scrollWidth
solusi tidak selalu bekerja.Dan jika Anda ingin menggunakan JavaScript murni, saya sarankan untuk menggunakan ini:
(naskah)
sumber
Solusi @ItaloBorssatto sempurna. Tetapi sebelum melihat SO - saya membuat keputusan. Ini dia :)
sumber
Implementasi saya)
sumber
ada beberapa mistasks dalam demo http://jsfiddle.net/brandonzylstra/hjk9mvcy/ disebutkan oleh https://stackoverflow.com/users/241142/iconoclast .
dalam demo-nya, tambahkan kode ini akan berfungsi:
sumber