Saya mencari solusi lintas browser yang definitif untuk mengatur posisi kursor / tanda sisipan ke posisi terakhir yang diketahui ketika contentEditable = 'on' <div> mendapatkan kembali fokus. Tampaknya fungsi default div konten yang dapat diedit adalah untuk memindahkan tanda sisipan / kursor ke awal teks dalam div setiap kali Anda mengkliknya, yang tidak diinginkan.
Saya percaya saya harus menyimpan dalam variabel posisi kursor saat ini ketika mereka meninggalkan fokus div, dan kemudian mengatur ulang ini ketika mereka memiliki fokus di dalam lagi, tetapi saya belum dapat mengumpulkan, atau menemukan pekerjaan contoh kode belum.
Jika ada yang punya pemikiran, cuplikan kode kerja atau sampel, saya akan senang melihatnya.
Saya belum memiliki kode apa pun, tetapi inilah yang saya miliki:
<script type="text/javascript">
// jQuery
$(document).ready(function() {
$('#area').focus(function() { .. } // focus I would imagine I need.
}
</script>
<div id="area" contentEditable="true"></div>
PS. Saya telah mencoba sumber ini tetapi tampaknya tidak berfungsi untuk <div>. Mungkin hanya untuk textarea ( Cara memindahkan kursor ke akhir entitas yang dapat diedit )
contentEditable
bekerja di browser non-IE o_oJawaban:
Ini kompatibel dengan browser berbasis standar, tetapi mungkin akan gagal di IE. Saya menyediakannya sebagai titik awal. IE tidak mendukung Rentang DOM.
sumber
cursorStart.appendChild(document.createTextNode('\u0002'));
adalah pengganti yang masuk akal kami pikir. untuk - char. Terima kasih untuk kodenyaSolusi ini berfungsi di semua browser utama:
saveSelection()
dilampirkan keonmouseup
danonkeyup
acara div dan menyimpan pilihan ke variabelsavedRange
.restoreSelection()
terlampir padaonfocus
acara div dan memilih kembali seleksi disimpansavedRange
.Ini berfungsi dengan baik kecuali jika Anda ingin pilihan dikembalikan ketika pengguna mengklik div juga (yang agak tidak intuitif seperti biasanya Anda mengharapkan kursor pergi ke mana Anda mengklik tetapi kode termasuk untuk kelengkapan)
Untuk mencapai ini
onclick
danonmousedown
acara dibatalkan oleh fungsicancelEvent()
yang merupakan fungsi lintas browser untuk membatalkan acara. ThecancelEvent()
Fungsi juga menjalankanrestoreSelection()
fungsi karena sebagai acara klik dibatalkan div tidak menerima fokus dan oleh karena itu tidak ada yang dipilih sama sekali kecuali fungsi ini dijalankan.Variabel
isInFocus
menyimpan apakah itu dalam fokus dan diubah menjadi "false"onblur
dan "true"onfocus
. Ini memungkinkan acara klik dibatalkan hanya jika div tidak dalam fokus (jika tidak, Anda tidak akan dapat mengubah pilihan sama sekali).Jika Anda ingin pemilihan diubah ketika div difokuskan dengan klik, dan tidak mengembalikan pilihan
onclick
(dan hanya ketika fokus diberikan kepada elemen yang menggunakandocument.getElementById("area").focus();
atau serupa secara terprogram maka cukup hapusonclick
danonmousedown
acara.onblur
Acara danonDivBlur()
dancancelEvent()
fungsi juga dapat dengan aman dihilangkan dalam kondisi ini.Kode ini akan berfungsi jika dijatuhkan langsung ke badan laman html jika Anda ingin mengujinya dengan cepat:
sumber
if (window.getSelection)...
hanya menguji apakah browser mendukunggetSelection
, bukan apakah ada pilihan?getSelection
api standar ataudocument.selection
api warisan yang digunakan oleh versi IE yang lebih lama.getRangeAt (0)
Panggilan nanti akan kembalinull
jika tidak ada pilihan, yang diperiksa untuk mengembalikan fungsi.else if (document.createRange)
) adalah apa yang saya lihat. Ini hanya akan dipanggil jikawindow.getSelection
tidak ada, belum menggunakanwindow.getSelection
window.getSelection
tetapi tidakdocument.createRange
- yang berarti blok kedua tidak akan pernah digunakan ...Memperbarui
Saya telah menulis perpustakaan lintas jangkauan dan pemilihan yang disebut Rangy yang menggabungkan versi yang disempurnakan dari kode yang saya posting di bawah ini. Anda dapat menggunakan modul save and restore pilihan untuk pertanyaan khusus ini, walaupun saya akan tergoda untuk menggunakan sesuatu seperti jawaban @Nico Burns jika Anda tidak melakukan hal lain dengan pilihan dalam proyek Anda dan tidak memerlukan sebagian besar dari Perpustakaan.
Jawaban sebelumnya
Anda dapat menggunakan IERange ( http://code.google.com/p/ierange/ ) untuk mengubah TextRange IE menjadi sesuatu seperti DOM Range dan menggunakannya bersamaan dengan sesuatu seperti titik awal kelopak mata. Secara pribadi saya hanya akan menggunakan algoritma dari IERange yang melakukan konversi Range <-> TextRange daripada menggunakan semuanya. Dan objek seleksi IE tidak memiliki properti focusNode dan anchorNode tetapi Anda harus bisa menggunakan Range / TextRange yang diperoleh dari seleksi.Saya mungkin mengumpulkan sesuatu untuk melakukan ini, akan dikirim kembali ke sini jika dan ketika saya melakukannya.
EDIT:
Saya telah membuat demo skrip yang melakukan ini. Ini berfungsi dalam semua yang saya coba sejauh ini kecuali untuk bug di Opera 9, yang saya belum punya waktu untuk melihatnya. Browser yang berfungsi adalah IE 5.5, 6 dan 7, Chrome 2, Firefox 2, 3 dan 3.5, dan Safari 4, semuanya di Windows.
http://www.timdown.co.uk/code/selections/
Perhatikan bahwa pilihan dapat dibuat mundur di browser sehingga simpul fokus berada di awal seleksi dan menekan tombol kursor kanan atau kiri akan menggerakkan tanda sisipan ke posisi relatif ke awal pemilihan. Saya tidak berpikir mungkin untuk mereplikasi ini ketika mengembalikan pilihan, jadi simpul fokus selalu di akhir seleksi.
Saya akan menulis ini sepenuhnya pada suatu saat nanti.sumber
Saya memiliki situasi terkait, di mana saya secara khusus perlu mengatur posisi kursor ke AKHIR div yang dapat diedit. Saya tidak ingin menggunakan perpustakaan lengkap seperti Rangy, dan banyak solusi yang terlalu berat.
Pada akhirnya, saya datang dengan fungsi jQuery sederhana ini untuk mengatur posisi karat ke akhir div yang dapat diedit:
Teorinya sederhana: tambahkan rentang ke ujung yang dapat diedit, pilih, dan kemudian hapus rentang - meninggalkan kita dengan kursor di akhir div. Anda bisa menyesuaikan solusi ini untuk memasukkan rentang di mana pun Anda inginkan, sehingga menempatkan kursor di tempat tertentu.
Penggunaannya sederhana:
Itu dia!
sumber
<span>
, yang secara tidak sengaja akan merusak tumpukan undo bawaan browser. Lihat stackoverflow.com/a/4238971/96100Saya mengambil jawaban Nico Burns dan membuatnya menggunakan jQuery:
div contentEditable="true"
Anda membutuhkan jQuery 1.6 atau lebih tinggi:
Tampilkan cuplikan kode
sumber
Setelah bermain-main, saya telah memodifikasi jawaban kelopak mata di atas dan menjadikannya plugin jQuery sehingga Anda bisa melakukan salah satunya:
Maafkan kiriman kode panjang, tetapi mungkin membantu seseorang:
sumber
Anda dapat memanfaatkan selectNodeContents yang didukung oleh browser modern.
sumber
Di Firefox Anda mungkin memiliki teks div di simpul anak (
o_div.childNodes[0]
)sumber