Bagaimana saya bisa membuat textarea diperluas secara otomatis menggunakan jQuery?
Saya memiliki kotak teks untuk menjelaskan agenda rapat, jadi saya ingin memperluas kotak teks itu ketika teks agenda saya terus mengembangkan area kotak teks itu.
Silakan pertimbangkan untuk mengubah pertanyaan Anda dan menghapus kata "jQuery"
vsync
Jawaban:
113
Saya sudah mencoba banyak dan yang
ini hebat. Tautan sudah mati. Versi yang lebih baru tersedia di sini . Lihat di bawah untuk versi lama. Anda dapat mencoba dengan menekan dan menahan tombol enter di textarea. Bandingkan efeknya dengan plugin textarea yang sedang dikembangkan secara otomatis ....
jika id textbox saya adalah txtMeetingAgenda maka bagaimana saya bisa mengimplementasikan properti Auto textArea di jquery
Piyush
di sini klik acara didefinisikan atau tidak
Piyush
ini semua tentang textarea tetapi bagaimana dengan textbox. Apakah plugin ini juga berfungsi untuk textbox?
Piyush
1
plugin ini tidak berfungsi dengan baik, coba autosize, itu jauh lebih baik
julesbou
Ini berfungsi dengan baik hanya satu cara ketika textarea tumbuh. Tetapi ketika Anda mulai menghapus teks, itu tidak secara otomatis mengurangi ketinggian.
ekashking
166
Jika Anda tidak menginginkan plugin, ada solusi yang sangat sederhana
Saya harus menghapus + parseFloat ($ (ini) .css ("borderTopWidth")) + parseFloat ($ (ini) .css ("borderBottomWidth")), jika tidak, akan jauh loop dengan textarea yang ditata dengan bootstrap
@metakungfu Yah alih-alih hanya downvoting, mungkin Anda bisa membantu meningkatkan jawabannya. Saya tidak punya cara untuk menguji atm omong kosong dan safari untuk windows dihentikan sejak lama. Jadi saya tidak bisa melakukan apa pun untuk menentukan mengapa itu tidak berhasil. Dari sisi kode, tidak ada yang salah dengan solusi ini. Apakah Anda yakin itu kode yang melanggar dan tidak melanggar safari di jsfiddle? safari cukup pemilih dan biola baru saja melalui pembaruan besar. Bisakah Anda membuka dev con dan memberikan lebih banyak detail?
SpYk3HH
1
juga perlu textarea overflow-y diatur ke tersembunyi untuk mencegah flashing scroll
iulial
2
Jika saya ingin menghapus baris yang ditambahkan, ukuran kotak teks yang diperbesar tetap sama, apakah mungkin juga dapat secara otomatis mengubah ukuran kembali?
Steven
33
Tumbuh / Menyusut textarea. Demo ini menggunakan jQuery untuk pengikatan acara, tetapi tidak harus dengan cara apa pun. ( tidak ada dukungan IE - IE tidak menanggapi perubahan baris atribut )
karena kode harus menunggu sedikit untuk huruf yang Anda ketik untuk dicetak di dalam textarea dan karenanya mengubah dimensi textarea
vsync
1
Saya melihat, solusinya rusak ketika teks disalin (CTRL + V) dari sumber apa pun. Sementara, jika teks diketik secara manual - ini mengagumkan dan sangat halus.
Satya Kalluri
1
@vsync: bagaimana Anda akan memodifikasi beberapa area teks? Yaitu Anda memiliki textarea1 dan textarea2 dan Anda ingin membiarkan keduanya tumbuh?
@AllyMurray - Saya pergi sekarang dan memperbaruinya menjadi 16 karena tampaknya memberikan hasil yang lebih baik. dan ya, itu adalah ketinggian garis yang diharapkan
jika Anda ingin mendapatkan scrollHeight dari $ (ini), Anda dapat menggunakan $ (ini) .prop ('scrollHeight'); sebaliknya;)
Samuel Vicent
3
itu berkedip setiap jeda baris
joe
11
Berkat SpYk3HH, saya mulai dengan solusinya dan mengubahnya menjadi solusi ini, yang menambahkan fungsionalitas yang menyusut dan bahkan lebih sederhana dan lebih cepat, saya kira.
itu tidak berfungsi sama sekali: / setiap karakter yang saya ketik, itu menambah tinggi.
vsync
1
Ini berfungsi sempurna untuk saya! Jelas tidak ada dalam kode sederhana untuk melakukan apa yang Anda katakan.
drolex
1
ya saya melihatnya sekarang, kode Anda harus memiliki garis yang menetapkan ketinggian ke 30 pada awalnya. ini mungkin ilne yang tidak diperlukan karena memaksa pengembang untuk mengubah kode, alih-alih kode memahami dan beradaptasi dengan textarea,
vsync
1
Itu tidak benar. Pengembang tidak perlu mengubah kode. Pengaturan tinggi ke 30 diperlukan dan itu bekerja untuk semuanya. Pengguna tidak pernah melihat itu terjadi. Itu adalah bagaimana ia dapat mengecilkan textarea. Kode mengerti dan beradaptasi dengan textarea. Itulah intinya.
drolex
Anda benar. halaman demo: jsbin.com/ObEcoza/2/edit (mengatur ketinggian 1pxtampaknya lebih baik)
vsync
10
Untuk mendefinisikan textarea yang dapat diperluas secara otomatis, Anda harus melakukan dua hal:
Perluas sekali Anda mengklik tombol Enter di dalamnya, atau ketik konten lebih dari satu baris.
Dan mengecilkannya secara blur untuk mendapatkan ukuran sebenarnya jika pengguna telah memasukkan spasi putih ( bonus )
Berikut adalah fungsi buatan tangan untuk menyelesaikan tugas.
Bekerja dengan baik dengan hampir semua browser (<IE7) . Inilah metodenya:
//Here is an event to get TextArea expand when you press Enter Key in it.// intiate a keypress event
$('textarea').keypress(function(e){if(e.which ==13){var control = e.target;var controlHeight = $(control).height();//add some height to existing height of control, I chose 17 as my line-height was 17 for the control
$(control).height(controlHeight+17);}});
$('textarea').blur(function(e){var textLines = $(this).val().trim().split(/\r*\n/).length;
$(this).val($(this).val().trim()).height(textLines*17);});
Kotak teks (elemen teks input yang saya duga) bukan multiline. Gunakan textarea tetapi gaya itu tepat - baris, kolom dll, dan kemudian gunakan plugin tumbuh otomatis seperti di atas.
richsage
4
Semua orang harus mencoba plugin jQuery ini: xautoresize-jquery . Ini sangat bagus dan harus menyelesaikan masalah Anda.
Yang ini memberi saya hasil terbaik dan juga mudah diimplementasikan.
blitzkid
4
function autosize(textarea){
$(textarea).height(1);// temporarily shrink textarea so that scrollHeight returns content height when content does not fill textarea
$(textarea).height($(textarea).prop("scrollHeight"));}
$(document).ready(function(){
$(document).on("input","textarea",function(){
autosize(this);});
$("textarea").each(function(){
autosize(this);});});
(Ini tidak akan berfungsi di Internet Explorer 9 atau lebih lama karena memanfaatkan inputacara)
dalam proyek saya, karena saya merender semua hal di halaman oleh Jquery dan naskah, solusi Anda adalah satu-satunya cara saya bisa menyelesaikan masalah saya terima kasih
Harry Sarshogh
3
Saya baru saja membangun fungsi ini untuk memperluas teks pada pageload. Hanya mengubah eachke keyupdan itu akan terjadi ketika textarea diketik di.
// On page-load, auto-expand textareas to be tall enough to contain initial content
$('textarea').each(function(){var pad = parseInt($(this).css('padding-top'));if($.browser.mozilla)
$(this).height(1);var contentHeight =this.scrollHeight;if(!$.browser.mozilla)
contentHeight -= pad *2;if(contentHeight > $(this).height())
$(this).height(contentHeight);});
Diuji di Chrome, IE9 dan Firefox. Sayangnya Firefox memiliki bug ini yang mengembalikan nilai salah scrollHeight, sehingga kode di atas berisi solusi (peretasan) untuk itu.
Saya memperbaiki beberapa bug dalam jawaban yang diberikan oleh Reigel (jawaban yang diterima):
Urutan di mana entitas html diganti sekarang tidak menyebabkan kode tak terduga dalam elemen bayangan. (Dokumen asli diganti ">" oleh "& ampgt;", menyebabkan perhitungan ketinggian yang salah dalam beberapa kasus yang jarang terjadi).
Jika teks berakhir dengan baris baru, bayangan sekarang mendapatkan karakter tambahan "#", alih-alih memiliki tinggi tambahan tetap, seperti halnya dalam aslinya.
Mengubah ukuran teks setelah inisialisasi memperbarui lebar bayangan.
menambahkan word-wrap: break-word for shadow, jadi itu pecah sama dengan textarea (memaksa istirahat untuk kata-kata yang sangat panjang)
Masih ada beberapa masalah terkait ruang. Saya tidak melihat solusi untuk spasi ganda, mereka ditampilkan sebagai spasi tunggal dalam bayangan (rendering html). Ini tidak dapat dipindahkan dengan menggunakan & nbsp ;, karena spasi harus dipecahkan. Juga, textarea memecah baris setelah spasi, jika tidak ada ruang untuk ruang itu akan memecah baris pada titik sebelumnya. Saran diterima.
Kode SpYk3HH dengan tambahan untuk ukuran menyusut.
function get_height(elt){return elt.scrollHeight + parseFloat($(elt).css("borderTopWidth"))+ parseFloat($(elt).css("borderBottomWidth"));}
$("textarea").keyup(function(e){var found =0;while(!found){
$(this).height($(this).height()-10);while($(this).outerHeight()< get_height(this)){
$(this).height($(this).height()+1);
found =1;};}});
Bagi siapa pun yang menggunakan plugin yang diposting oleh Reigel, harap diperhatikan bahwa ini akan menonaktifkan fungsi undo di Internet Explorer (coba demo dulu).
Jika ini merupakan masalah bagi Anda maka saya akan menyarankan menggunakan plugin yang diposting oleh @richsage sebagai gantinya, karena tidak menderita masalah ini. Lihat poin kedua tentang Mencari Textarea Ubah Ukuran Terbaik untuk informasi lebih lanjut.
Saya ingin animasi dan menyusut otomatis. Kombinasi ini tampaknya sulit, karena orang-orang datang dengan solusi yang cukup intens untuk itu. Saya telah membuatnya multi-textarea-proof, juga. Dan itu tidak seberat plugin jQuery.
Saya mendasarkan diri saya pada jawaban vsync (dan peningkatan yang dia buat untuk itu), http://codepen.io/anon/pen/vlIwj adalah codepen untuk perbaikan saya.
Catatan: Saya perhatikan kadang-kadang berfungsi lebih baik dengan ukuran kotak: kotak konten. Saya tidak sepenuhnya yakin mengapa, harus memproses padding dengan benar :(
Lodewijk
1
Ada banyak jawaban untuk ini tetapi saya menemukan sesuatu yang sangat sederhana, lampirkan acara keyup ke textarea dan periksa untuk memasukkan tombol tekan kode kuncinya adalah 13
Jawaban:
Saya sudah mencoba banyak dan yang ini hebat.Tautan sudah mati. Versi yang lebih baru tersedia di sini . Lihat di bawah untuk versi lama.Anda dapat mencoba dengan menekan dan menahan tombol enter di textarea. Bandingkan efeknya dengan plugin textarea yang sedang dikembangkan secara otomatis ....
edit berdasarkan komentar
Catatan: Anda harus memasukkan file js yang dibutuhkan ...
Untuk mencegah bilah gulir di textarea berkedip & mati selama ekspansi / kontraksi, Anda dapat mengatur juga
overflow
kehidden
:Memperbarui:
Tautan di atas rusak. Tetapi Anda masih bisa mendapatkan file javascript di sini .
sumber
Jika Anda tidak menginginkan plugin, ada solusi yang sangat sederhana
Lihat itu bekerja di jsFiddle saya dulu menjawab pertanyaan teks lain di sini .
Untuk menjawab pertanyaan tentang melakukannya secara terbalik atau membuatnya lebih kecil saat teks dihapus: jsFiddle
@ Jason telah merancang satu di sini
sumber
if (this.clientHeight < this.scrollHeight) { this.style.height = this.scrollHeight + 'px'; }
Tumbuh / Menyusut textarea. Demo ini menggunakan jQuery untuk pengikatan acara, tetapi tidak harus dengan cara apa pun.
( tidak ada dukungan IE - IE tidak menanggapi perubahan baris atribut )
HALAMAN DEMO
HTML
CSS
javascript (diperbarui)
sumber
sumber
Anda bisa coba yang ini
sumber
Berkat SpYk3HH, saya mulai dengan solusinya dan mengubahnya menjadi solusi ini, yang menambahkan fungsionalitas yang menyusut dan bahkan lebih sederhana dan lebih cepat, saya kira.
Diuji dalam browser Chrome, Firefox dan Android 2.3.3 saat ini.
Anda mungkin melihat kilatan bilah gulir di beberapa browser. Tambahkan CSS ini untuk menyelesaikannya.
sumber
1px
tampaknya lebih baik)Untuk mendefinisikan textarea yang dapat diperluas secara otomatis, Anda harus melakukan dua hal:
Berikut adalah fungsi buatan tangan untuk menyelesaikan tugas.
Bekerja dengan baik dengan hampir semua browser (<IE7) . Inilah metodenya:
DI SINI ada posting tentang ini.
sumber
Saya telah menggunakan plugin Textarea Expander jQuery sebelumnya dengan hasil yang baik.
sumber
Semua orang harus mencoba plugin jQuery ini: xautoresize-jquery . Ini sangat bagus dan harus menyelesaikan masalah Anda.
sumber
(Ini tidak akan berfungsi di Internet Explorer 9 atau lebih lama karena memanfaatkan
input
acara)sumber
Saya baru saja membangun fungsi ini untuk memperluas teks pada pageload. Hanya mengubah
each
kekeyup
dan itu akan terjadi ketika textarea diketik di.Diuji di Chrome, IE9 dan Firefox. Sayangnya Firefox memiliki bug ini yang mengembalikan nilai salah
scrollHeight
, sehingga kode di atas berisi solusi (peretasan) untuk itu.sumber
Saya memperbaiki beberapa bug dalam jawaban yang diberikan oleh Reigel (jawaban yang diterima):
Masih ada beberapa masalah terkait ruang. Saya tidak melihat solusi untuk spasi ganda, mereka ditampilkan sebagai spasi tunggal dalam bayangan (rendering html). Ini tidak dapat dipindahkan dengan menggunakan & nbsp ;, karena spasi harus dipecahkan. Juga, textarea memecah baris setelah spasi, jika tidak ada ruang untuk ruang itu akan memecah baris pada titik sebelumnya. Saran diterima.
Kode yang diperbaiki:
sumber
Kode SpYk3HH dengan tambahan untuk ukuran menyusut.
sumber
Ini bekerja lebih baik untuk saya:
sumber
Orang-orang tampaknya memiliki solusi yang sangat berhasil ...
Beginilah cara saya melakukannya:
Ini akan bekerja dengan garis panjang, serta garis putus .. tumbuh dan menyusut ..
sumber
Saya menulis fungsi jquery ini yang sepertinya berfungsi.
Anda perlu menentukan ketinggian minimum dalam css, dan kecuali Anda ingin melakukan beberapa pengkodean, panjangnya harus dua digit. yaitu 12px;
sumber
Bagi siapa pun yang menggunakan plugin yang diposting oleh Reigel, harap diperhatikan bahwa ini akan menonaktifkan fungsi undo di Internet Explorer (coba demo dulu).
Jika ini merupakan masalah bagi Anda maka saya akan menyarankan menggunakan plugin yang diposting oleh @richsage sebagai gantinya, karena tidak menderita masalah ini. Lihat poin kedua tentang Mencari Textarea Ubah Ukuran Terbaik untuk informasi lebih lanjut.
sumber
Ada juga proyek yang sangat keren
bgrins/ExpandingTextareas (github)
, berdasarkan publikasi oleh Neill Jenkins yang disebut Memperluas Daerah Teks Elegansumber
Saya ingin animasi dan menyusut otomatis. Kombinasi ini tampaknya sulit, karena orang-orang datang dengan solusi yang cukup intens untuk itu. Saya telah membuatnya multi-textarea-proof, juga. Dan itu tidak seberat plugin jQuery.
Saya mendasarkan diri saya pada jawaban vsync (dan peningkatan yang dia buat untuk itu), http://codepen.io/anon/pen/vlIwj adalah codepen untuk perbaikan saya.
HTML
CSS
JS
sumber
Ada banyak jawaban untuk ini tetapi saya menemukan sesuatu yang sangat sederhana, lampirkan acara keyup ke textarea dan periksa untuk memasukkan tombol tekan kode kuncinya adalah 13
keyPressHandler(e){
if(e.keyCode == 13){
e.target.rows = e.target.rows + 1;
}
}
Ini akan menambahkan baris lain ke textarea Anda dan Anda dapat mengatur lebar menggunakan CSS.
sumber
Katakanlah Anda mencoba menyelesaikan ini menggunakan Knockout ... beginilah caranya:
Di halaman:
Dalam model tampilan:
Ini akan berfungsi bahkan jika Anda memiliki beberapa textareas yang dibuat oleh foreach Knockout seperti yang saya lakukan.
sumber
Solusi sederhana:
HTML:
JS:
https://fiddle.jshell.net/7wsnwbzg/
sumber
Solusi paling sederhana:
html:
css:
js (jquery):
sumber
Solusi dengan JS murni
https://jsfiddle.net/Samb102/cjqa2kf4/54/
sumber
Ini adalah solusi yang akhirnya saya gunakan. Saya menginginkan solusi inline, dan sejauh ini tampaknya berhasil:
sumber
https://codepen.io/nanachi1/pen/rNNKrzQ
ini seharusnya bekerja.
sumber
@Georgiy Ivankin membuat saran dalam komentar, saya berhasil menggunakannya :) -, tetapi dengan sedikit perubahan:
Itu berhenti berkembang setelah mencapai ketinggian maksimum 200px
sumber
Pertanyaan lama tetapi Anda dapat melakukan sesuatu seperti ini:
html:
jquery:
Dengan cara ini pengubahan ukuran otomatis akan berlaku untuk semua textarea dengan kelas "area teks". Juga menyusut saat teks dihapus.
jsfiddle:
https://jsfiddle.net/rotaercz/46rhcqyn/
sumber
Coba ini:
sumber
Solusi jQuery sederhana:
HTML:
Overflow harus disembunyikan . Ubah ukuran tidak ada jika Anda tidak ingin membuatnya dapat diubah ukurannya dengan mouse.
sumber