Saya memiliki editor dasar berdasarkan execCommand
contoh yang diperkenalkan di sini. Ada tiga cara untuk menempelkan teks di dalam execCommand
area:
- Ctrl+V
- Klik Kanan -> Tempel
- Klik Kanan -> Tempel Sebagai Teks Biasa
Saya ingin mengizinkan hanya menempelkan teks biasa tanpa markup HTML. Bagaimana cara memaksa dua tindakan pertama untuk menempelkan Teks Biasa?
Solusi yang Mungkin: Cara yang dapat saya pikirkan adalah menyetel listener untuk acara keyup untuk ( Ctrl+ V) dan menghapus tag HTML sebelum menempel.
- Apakah ini solusi terbaik?
- Apakah antipeluru untuk menghindari markup HTML dalam bentuk tempel?
- Bagaimana cara menambahkan pendengar ke Klik Kanan -> Tempel?
javascript
html
dom-events
execcommand
Googlebot
sumber
sumber
Jawaban:
Ini akan mencegat
paste
acara, membatalkanpaste
, dan secara manual menyisipkan representasi teks dari papan klip:http://jsfiddle.net/HBEzc/ . Ini harus yang paling andal:
Saya tidak yakin dengan dukungan lintas browser.
sumber
text
berisi HTML (mis. Jika Anda menyalin kode HTML sebagai teks biasa) maka itu akan benar-benar menempelkannya sebagai HTML. Inilah solusinya, tetapi tidak terlalu bagus: jsfiddle.net/HBEzc/3 .var text = (event.originalEvent || event).clipboardData.getData('text/plain');
menyediakan sedikit lebih banyak kompatibilitas lintas-browser<div></div>
itu, konten akan ditambahkan sebagai elemen turunan dari elemen konten yang dapat diedit. Saya memperbaikinya seperti ini:document.execCommand("insertText", false, text);
insertHTML
daninsertText
tidak berfungsi di IE11, namundocument.execCommand('paste', false, text);
berfungsi dengan baik. Meskipun itu tampaknya tidak berfungsi di browser lain> _>.Saya tidak bisa mendapatkan jawaban yang diterima di sini untuk bekerja di IE jadi saya mencari-cari dan menemukan jawaban ini yang berfungsi di IE11 dan versi terbaru Chrome dan Firefox.
sumber
Solusi dekat sebagai pimvdb. Tetapi ini berfungsi dari FF, Chrome dan IE 9:
sumber
content
tugas variabel hubung singkat . Saya telah menemukan bahwa menggunakangetData('Text')
berfungsi lintas browser, jadi Anda dapat membuat tugas itu hanya sekali seperti ini:var content = ((e.originalEvent || e).clipboardData || window.clipboardData).getData('Text');
Maka Anda hanya perlu menggunakan logika untuk perintah tempel / sisipkan lintas browser.document.selection.createRange().pasteHTML(content)
... baru saja diuji di IE11 dan tidak berfungsi seperti itu.document.execCommand('insertText', false, content)
tidak berfungsi pada IE11 dan Edge. Selain itu, Chrome versi terbaru sekarang mendukungdocument.execCommand('paste', false, content)
, yang lebih sederhana. Mereka mungkin mencelainsertText
.Tentu saja pertanyaannya sudah terjawab dan topiknya sangat tua tetapi saya ingin memberikan solusi saya karena sederhana dan bersih:
Ini ada di dalam paste-event saya di contenteditable-div saya.
Bagian lain berasal dari pos-SO lain yang tidak dapat saya temukan lagi ...
UPDATE 19.11.2014: SO-post lainnya
sumber
Tak satu pun dari jawaban yang diposting tampaknya benar-benar berfungsi lintas browser atau solusinya terlalu rumit:
insertText
tidak didukung oleh IEpaste
hasil perintah dalam kesalahan stack overflow di IE11Apa yang berhasil untuk saya (IE11, Edge, Chrome dan FF) adalah sebagai berikut:
Perhatikan bahwa penangan tempel khusus hanya diperlukan / berfungsi untuk
contenteditable
node. Karena keduanyatextarea
daninput
bidang biasa sama sekali tidak mendukung menempelkan konten HTML, jadi tidak ada yang perlu dilakukan di sini.sumber
.originalEvent
di event handler (baris 3) agar ini berfungsi. Jadi garis terlihat lengkap seperti ini:const text = ev.clipboardData ? ev.clipboardData.getData('text/plain') : window.clipboardData.getData('Text');
. Berfungsi di Chrome, Safari, Firefox terbaru.Firefox tidak mengizinkan Anda untuk mengakses data papan klip, jadi Anda harus membuat 'retasan' agar dapat berfungsi. Saya belum dapat menemukan solusi lengkap, namun Anda dapat memperbaikinya untuk pasta ctrl + v dengan membuat area teks & menempelkannya:
sumber
Saya juga sedang mengerjakan pasta teks biasa dan saya mulai membenci semua kesalahan execCommand dan getData, jadi saya memutuskan untuk melakukannya dengan cara klasik dan bekerja seperti pesona:
Kode dengan notasi saya dapat ditemukan di sini: http://www.albertmartin.de/blog/code.php/20/plain-text-paste-with-javascript
sumber
Kode di atas berfungsi untuk saya di IE10 dan IE11 dan sekarang juga berfungsi di Chrome dan Safari. Tidak diuji di Firefox.
sumber
Di IE11, execCommand tidak berfungsi dengan baik. Saya menggunakan kode di bawah ini untuk IE11
<div class="wmd-input" id="wmd-input-md" contenteditable=true>
adalah kotak div saya.Saya membaca data clipboard dari window.clipboardData dan memodifikasi textContent div dan memberi tanda sisipan.
Saya memberikan batas waktu untuk menyetel tanda sisipan, karena jika saya tidak menyetel batas waktu, tanda sisipan akan menjadi akhir div.
dan Anda harus membaca clipboardData di IE11 dengan cara di bawah ini. Jika Anda tidak melakukannya, karakter baris baru tidak ditangani dengan benar, jadi tanda sisipan salah.
Diuji di IE11 dan chrome. Ini mungkin tidak berfungsi di IE9
sumber
Setelah menelusuri dan mencoba, saya telah menemukan solusi yang optimal
sumber
Oke karena semua orang mencoba untuk mengatasi data clipboard, memeriksa peristiwa penekanan tombol, dan menggunakan execCommand.
Saya memikirkan ini
KODE
sumber