Dalam JavaScript, dimungkinkan untuk memilih teks secara terprogram dalam elemen input
atau textarea
. Anda dapat memfokuskan input dengan ipt.focus()
, lalu memilih kontennya dengan ipt.select()
. Anda bahkan dapat memilih rentang tertentu dengan ipt.setSelectionRange(from,to)
.
Pertanyaan saya adalah: apakah ada cara untuk melakukan ini dalam sebuah contenteditable
elemen juga?
Saya menemukan bahwa saya bisa melakukannya elem.focus()
, untuk meletakkan tanda sisipan di contenteditable
elemen, tetapi kemudian berjalan elem.select()
tidak berfungsi (dan juga tidak setSelectionRange
). Saya tidak dapat menemukan apa pun di web tentang hal itu, tetapi mungkin saya mencari hal yang salah ...
Omong-omong, jika ada bedanya, saya hanya membutuhkannya untuk berfungsi di Google Chrome, karena ini untuk ekstensi Chrome.
sumber
selectElementContents()
asetTimeout()
ataurequestAnimationFrame()
jika dipanggil darionfocus
. Lihat jsfiddle.net/rudiedirkx/MgASG/1/showfocus()
.Selain jawaban Tim Downs , saya membuat solusi yang berfungsi bahkan di IE lama:
Diuji di IE 8+, Firefox 3+, Opera 9+, & Chrome 2+. Bahkan saya telah menyiapkannya menjadi plugin jQuery:
... dan siapa yang tertarik, ini sama untuk semua pecandu kopi:
Memperbarui:
Jika Anda ingin memilih seluruh halaman atau konten dari wilayah yang dapat diedit (ditandai dengan
contentEditable
), Anda dapat melakukannya lebih sederhana dengan beralih kedesignMode
dan menggunakandocument.execCommand
:Ada titik awal yang baik di MDN dan dokumentasi yang sedikit .
(bekerja dengan baik di IE6 +, Opera 9+, Firefoy 3+, Chrome 2+) http://caniuse.com/#search=execCommand
sumber
Karena semua jawaban yang ada berhubungan dengan
div
elemen, saya akan menjelaskan bagaimana melakukannya denganspan
s.Ada perbedaan halus saat memilih rentang teks dalam a
span
. Untuk dapat meneruskan indeks awal dan akhir teks, Anda harus menggunakanText
node, seperti yang dijelaskan di sini :sumber
r.setStart(e.firstChild,0); r.setEnd(e.lastChild,e.lastChild.textContent.length);
Tentu saja Anda harus memeriksa bahwa e.firstChild sebenarnya bukan null.<div>
dan<span>
elemen. Setidaknya, tidak seperti yang Anda gambarkan.Rangy memungkinkan Anda melakukan lintas browser ini dengan kode yang sama. Rangy adalah implementasi lintas-browser dari metode DOM untuk pemilihan. Ini telah diuji dengan baik dan membuat ini jauh lebih tidak menyakitkan. Saya menolak untuk menyentuh konten yang dapat diedit tanpanya.
Anda dapat menemukan rangy di sini:
http://code.google.com/p/rangy/
Dengan rangy dalam proyek Anda, Anda selalu dapat menulis ini, meskipun browsernya IE 8 atau sebelumnya dan memiliki API asli yang sama sekali berbeda untuk pilihan:
Di mana "contentEditableNode" adalah node DOM yang memiliki atribut contenteditable. Anda mungkin mengambilnya seperti ini:
Atau jika jQuery sudah menjadi bagian dari proyek Anda dan Anda merasa nyaman:
sumber
Cara modern dalam melakukan sesuatu adalah seperti ini. Rincian lebih lanjut tentang MDN
sumber
[Diperbarui untuk memperbaiki kesalahan]
Berikut adalah contoh yang diadaptasi dari jawaban ini yang tampaknya berfungsi dengan baik di Chrome - Pilih rentang di div konten yang dapat diedit
HTML adalah:
sumber