Saya punya HTML sederhana ini sebagai contoh:
<div id="editable" contenteditable="true">
text text text<br>
text text text<br>
text text text<br>
</div>
<button id="button">focus</button>
Saya ingin hal yang sederhana - ketika saya mengklik tombol, saya ingin menempatkan tanda (kursor) ke tempat tertentu di div yang dapat diedit. Dari pencarian melalui web, JS ini saya lampirkan pada klik tombol, tetapi tidak berfungsi (FF, Chrome):
var range = document.createRange();
var myDiv = document.getElementById("editable");
range.setStart(myDiv, 5);
range.setEnd(myDiv, 5);
Apakah mungkin untuk mengatur posisi caret secara manual seperti ini?
setSelectionRange()
fungsi dari jawaban yang saya tulis di sini: stackoverflow.com/questions/6240139/… . Seperti yang saya catat dalam jawaban, ada berbagai hal yang tidak akan ditangani dengan benar / konsisten tetapi mungkin cukup baik.document.createRange
(atauwindow.getSelection
, tetapi tidak akan sampai sejauh itu).Sebagian besar jawaban yang Anda temukan pada penentuan posisi kursor yang dapat diedit cukup sederhana karena hanya memenuhi input dengan teks vanilla biasa. Setelah Anda menggunakan elemen html dalam wadah, teks yang dimasukkan akan dipecah menjadi node dan didistribusikan secara bebas di seluruh struktur pohon.
Untuk mengatur posisi kursor saya memiliki fungsi ini yang loop semua simpul teks anak dalam node yang disediakan dan menetapkan rentang dari awal node awal ke karakter chars.count :
Saya kemudian memanggil rutin dengan fungsi ini:
Range.collapse (false) menetapkan kursor ke akhir rentang. Saya sudah mengujinya dengan versi terbaru Chrome, IE, Mozilla dan Opera dan semuanya bekerja dengan baik.
PS. Jika ada yang tertarik, saya mendapatkan posisi kursor saat ini menggunakan kode ini:
Kode melakukan kebalikan dari fungsi yang ditetapkan - mendapat jendela saat ini.getSelection (). FocusNode dan focusOffset dan menghitung mundur semua karakter teks yang ditemui sampai menyentuh node induk dengan id dari containerId. Fungsi isChildOf hanya memeriksa sebelum menjalankan bahwa node suplied sebenarnya adalah anak dari parentId yang disediakan .
Kode harus bekerja langsung tanpa perubahan, tetapi saya baru saja mengambilnya dari plugin jQuery yang telah saya kembangkan sehingga telah meretas beberapa dari ini - beri tahu saya jika ada yang tidak berfungsi!
sumber
node.id
danparentId
berhubungan dengan tanpa contoh. Terima kasih :)Jika Anda tidak ingin menggunakan jQuery, Anda dapat mencoba pendekatan ini:
editableDiv
Anda elemen yang dapat diedit, jangan lupa mengaturid
untuk itu. Maka Anda harus mendapatkaninnerHTML
dari elemen dan memotong semua garis rem. Dan atur runtuh dengan argumen berikutnya.sumber
sumber
Ini sangat sulit mengatur tanda pada posisi yang tepat ketika Anda memiliki elemen muka seperti (p) (rentang) dll. Tujuannya adalah untuk mendapatkan (objek teks):
sumber
Saya sedang menulis highlighter sintaks (dan editor kode dasar), dan saya perlu tahu bagaimana cara mengetikkan char tanda kutip tunggal secara otomatis dan memindahkan tanda sisipan (seperti banyak editor kode saat ini).
Inilah cuplikan dari solusi saya, terima kasih banyak bantuan dari utas ini, MDN docs, dan banyak moz console menonton ..
Ini dalam elemen div yang dapat diedit
Saya meninggalkan ini di sini sebagai ucapan terima kasih, menyadari sudah ada jawaban yang diterima.
sumber
Saya membuat ini untuk editor teks sederhana saya.
Perbedaan dari metode lain:
pemakaian
selection.ts
sumber
Saya refactored jawaban Liam. Saya letakkan di kelas dengan metode statis, saya membuat fungsinya menerima elemen, bukan #id, dan beberapa tweak kecil lainnya.
Kode ini sangat baik untuk memperbaiki kursor di kotak teks kaya yang mungkin Anda buat
<div contenteditable="true">
. Saya terjebak dalam hal ini selama beberapa hari sebelum tiba di kode di bawah ini.sunting: Jawabannya dan jawaban ini memiliki bug yang melibatkan hitting enter. Karena enter tidak dihitung sebagai karakter, posisi kursor akan kacau setelah menekan enter. Jika saya dapat memperbaiki kode, saya akan memperbarui jawaban saya.
edit2: Simpan sendiri banyak sakit kepala dan pastikan Anda
<div contenteditable=true>
yaitudisplay: inline-block
. Ini memperbaiki beberapa bug yang terkait dengan penempatan Chrome<div>
alih-alih<br>
saat Anda menekan enter.Cara Penggunaan
Kode
sumber
Saya pikir itu tidak mudah untuk mengatur tanda sisipan ke beberapa posisi dalam elemen yang dapat diedit. Saya menulis kode saya sendiri untuk ini. Ini memotong simpul pohon calving berapa banyak karakter yang tersisa dan menetapkan tanda sisipan dalam elemen yang diperlukan. Saya tidak banyak menguji kode ini.
Saya juga menulis kode untuk mendapatkan posisi tanda kuret saat ini (tidak menguji):
Anda juga perlu mengetahui range.startOffset dan range.endOffset berisi offset karakter untuk node teks (nodeType === 3) dan offset simpul anak untuk node elemen (nodeType === 1). range.startContainer dan range.endContainer dapat merujuk ke simpul elemen apa pun dari tingkat apa pun di pohon (tentu saja mereka juga dapat merujuk ke simpul teks).
sumber
Berdasarkan jawaban Tim Down, tetapi memeriksa baris teks "baik" yang terakhir diketahui. Ini menempatkan kursor di bagian paling akhir.
Selain itu, saya juga bisa secara rekursif / iteratif memeriksa anak terakhir dari setiap anak terakhir berturut-turut untuk menemukan simpul teks "baik" terakhir yang absolut dalam DOM.
sumber