Saya menemukan banyak sekali jawaban crossbrowser yang bagus tentang cara MENGATUR posisi indeks kursor atau tanda sisipan dalam sebuah contentEditable
elemen, tetapi tidak ada tentang cara MENDAPATKAN atau menemukan indeksnya ...
Yang ingin saya lakukan adalah mengetahui indeks tanda sisipan dalam div ini, di keyup
.
Jadi, saat pengguna mengetik teks, saya bisa mengetahui indeks kursornya di dalam contentEditable
elemen kapan saja .
EDIT: Saya mencari INDEX dalam konten div (teks), bukan koordinat kursor.
<div id="contentBox" contentEditable="true"></div>
$('#contentbox').keyup(function() {
// ... ?
});
<a>
elemen di dalam<div>
, offset apa yang Anda inginkan? Offset dalam teks di dalam<a>
?Jawaban:
Kode berikut mengasumsikan:
<div>
dan tidak ada node lainwhite-space
properti CSS yang disetel kepre
Jika Anda memerlukan pendekatan yang lebih umum yang akan mengerjakan konten dengan elemen bersarang, coba jawaban ini:
https://stackoverflow.com/a/4812022/96100
Kode:
sumber
<a>
elemen di dalam<div>
, offset apa yang Anda inginkan? Offset dalam teks di dalam<a>
?keyup
sepertinya acara yang salah untuk ini tetapi itulah yang digunakan dalam pertanyaan awal.getCaretPosition()
itu sendiri baik-baik saja dalam batasannya sendiri.<br>
atau<div>
, yang melanggar asumsi pertama yang disebutkan dalam jawaban. Jika Anda memerlukan solusi yang sedikit lebih umum, Anda dapat mencoba stackoverflow.com/a/4812022/96100Beberapa kerutan yang menurut saya tidak diatasi dalam jawaban lain:
Berikut cara untuk mendapatkan posisi awal dan akhir sebagai offset ke nilai textContent elemen:
sumber
sumber
Coba ini:
Caret.js Dapatkan posisi tanda sisipan dan offset dari bidang teks
https://github.com/ichord/Caret.js
demo: http://ichord.github.com/Caret.js
sumber
contenteditable
li
ketika mengklik tombol untuk mengganti namali
konten.Agak terlambat ke pesta, tetapi siapa pun yang kesulitan. Tak satu pun dari penelusuran Google yang saya temukan selama dua hari terakhir ini menghasilkan apa pun yang berhasil, tetapi saya menemukan solusi ringkas dan elegan yang akan selalu berfungsi, tidak peduli berapa banyak tag bersarang yang Anda miliki:
Ini memilih semua jalan kembali ke awal paragraf dan kemudian menghitung panjang string untuk mendapatkan posisi saat ini dan kemudian membatalkan pemilihan untuk mengembalikan kursor ke posisi saat ini. Jika Anda ingin melakukan ini untuk seluruh dokumen (lebih dari satu paragraf), ubah
paragraphboundary
kedocumentboundary
atau perincian apa pun untuk kasus Anda. Lihat API untuk lebih jelasnya . Bersulang! :)sumber
<div contenteditable> some text here <i>italic text here</i> some other text here <b>bold text here</b> end of text </div>
Everytime saya menempatkan kursor sebelumi
tag atau elemen html anak apa pun di dalamdiv
, posisi kursor dimulai dari 0. Apakah ada cara untuk menghindari penghitungan memulai ulang ini?sumber
Yang ini berhasil untuk saya:
Saluran panggilan bergantung pada jenis peristiwa, untuk peristiwa utama gunakan ini:
untuk acara mouse gunakan ini:
pada dua kasus ini saya menangani garis putus-putus dengan menambahkan indeks target
sumber
Catatan: objek rentang itu sendiri dapat disimpan dalam variabel, dan dapat dipilih kembali kapan saja kecuali konten dari div konten yang dapat diedit berubah.
Referensi untuk IE 8 dan yang lebih rendah: http://msdn.microsoft.com/en-us/library/ms535872(VS.85).aspx
Referensi untuk browser standar (semua lainnya): https://developer.mozilla.org/en/DOM/range (ini adalah dokumen mozilla, tetapi kode juga berfungsi di chrome, safari, opera, dan ie9)
sumber
Range
objek dikembalikan oleh kebanyakan browser danTextRange
objek dikembalikan oleh IE adalah hal-hal yang sangat berbeda, jadi saya tidak yakin jawaban ini memecahkan banyak.Karena ini membutuhkan waktu lama bagi saya untuk mencari tahu menggunakan jendela baru.getSelection API yang akan saya bagikan untuk anak cucu. Perhatikan bahwa MDN menyarankan ada dukungan yang lebih luas untuk window.getSelection, namun, jarak tempuh Anda mungkin berbeda.
Berikut adalah jsfiddle yang aktif pada keyup. Namun perlu dicatat, bahwa penekanan tombol arah cepat, serta penghapusan cepat tampaknya merupakan peristiwa lewati.
sumber
Cara lurus ke depan, yang melakukan iterasi melalui semua anak div konten yang dapat diedit hingga mencapai endContainer. Kemudian saya menambahkan offset penampung akhir dan kami memiliki indeks karakter. Harus bekerja dengan sejumlah sarang. menggunakan rekursi.
Catatan: membutuhkan poly fill untuk dukungan yaitu
Element.closest('div[contenteditable]')
https://codepen.io/alockwood05/pen/vMpdmZ
sumber