Saya menggunakan dialog jquery untuk menyajikan formulir (diambil melalui AJAX). Pada beberapa formulir saya menggunakan CKEditor untuk textareas. Editor menampilkan baik-baik saja pada pemuatan pertama.
Ketika pengguna membatalkan dialog, saya menghapus konten sehingga mereka dimuat segar pada permintaan nanti. Masalahnya adalah, setelah dialog dimuat ulang, CKEditor mengklaim editor tersebut sudah ada.
uncaught exception: [CKEDITOR.editor] The instance "textarea_name" already exists.
API menyertakan metode untuk menghancurkan editor yang ada, dan saya telah melihat orang-orang mengklaim ini adalah solusinya:
if (CKEDITOR.instances['textarea_name']) {
CKEDITOR.instances['textarea_name'].destroy();
}
CKEDITOR.replace('textarea_name');
Ini tidak berfungsi untuk saya, karena saya menerima kesalahan baru sebagai gantinya:
TypeError: Result of expression 'i.contentWindow' [null] is not an object.
Kesalahan ini tampaknya terjadi pada "destroy ()" daripada "replace ()". Adakah yang pernah mengalami ini dan menemukan solusi yang berbeda?
Apakah mungkin untuk 'merender ulang' editor yang ada, daripada menghancurkan dan menggantinya?
DIPERBARUI Berikut adalah pertanyaan lain yang berhubungan dengan masalah yang sama, tetapi dia telah menyediakan kasus uji yang dapat diunduh .
sumber
sumber
Saya mengalami masalah ini juga, tetapi saya menyelesaikannya dengan cara yang jauh lebih sederhana ...
Saya menggunakan kelas "ckeditor" dalam skrip jQuery saya sebagai pemilih textareas yang ingin saya gunakan untuk CKEditor. Skrip JS ckeditor default juga menggunakan kelas ini untuk mengidentifikasi textarea mana yang akan digunakan untuk CKEditor.
Ini berarti ada konflik antara skrip jQuery saya dan skrip ckeditor default.
Saya hanya mengubah kelas textarea dan skrip jQuery saya menjadi 'do_ckeditor' (Anda dapat menggunakan apa saja kecuali "ckeditor") dan itu berhasil.
sumber
Ini adalah solusi paling sederhana (dan satu-satunya) yang berhasil untuk saya:
Menghapus entri ini dalam larik mencegah pemeriksaan keamanan formulir ini untuk menghancurkan aplikasi Anda.
destroy () dan remove () tidak berhasil untuk saya.
sumber
delete
ataudestroy()
sepenuhnya bersihkan instance editor. Hal-hal seperti kamus dan objek terkait lainnya akan tetap mengintai.Mungkin ini akan membantu Anda - Saya telah melakukan sesuatu yang serupa menggunakan jquery, kecuali saya memuat objek ckeditor dalam jumlah yang tidak diketahui. Butuh beberapa saat untuk tersandung pada ini - tidak jelas dalam dokumentasi.
Dan inilah yang saya jalankan untuk mendapatkan konten dari editor:
UPDATE : Saya telah mengubah jawaban saya untuk menggunakan metode yang benar - yaitu .destroy (). .remove () dimaksudkan untuk menjadi internal, dan didokumentasikan dengan tidak benar pada satu titik.
sumber
Saya mengalami masalah serupa di mana kami membuat beberapa contoh CKeditor untuk konten yang dimuat melalui ajax.
Simpan DOM di memori dan tidak menghapus semua binding.
Memberikan error i.contentWindow error setiap kali saya membuat instance baru dengan data baru dari ajax. Tetapi ini hanya sampai saya mengetahui bahwa saya menghancurkan instance setelah membersihkan DOM.
Gunakan destroy () saat instance & DOMnya ada di halaman, maka itu berfungsi dengan baik.
sumber
Untuk permintaan ajax,
potongan ini menghapus semua contoh dari dokumen. Kemudian buat instance baru.
sumber
sumber
The
i.contentWindow is null
Kesalahan tampaknya terjadi saat memanggil menghancurkan pada contoh editor yang diikat ke textarea tidak lagi di DOM.CKEDITORY.destroy
mengambil parameternoUpdate
.APIdoc menyatakan:
Jadi, untuk menghindari kesalahan, panggil penghancuran sebelum menghapus elemen textarea dari DOM, atau panggil destory (true) untuk menghindari mencoba memperbarui elemen DOM yang tidak ada.
(menggunakan versi 3.6.2 dengan adaptor jQuery)
sumber
Inilah yang berhasil untuk saya:
sumber
Saya menggunakan ini sebelum panggilan saya untuk membuat sebuah instance (yang per pemuatan halaman). Tidak yakin bagaimana hal ini mempengaruhi penanganan memori dan apa yang tidak. Ini hanya akan berfungsi jika Anda ingin mengganti semua contoh di halaman.
sumber
Saya telah menyiapkan solusi saya sendiri berdasarkan semua kode di atas.
Ini bekerja dengan sempurna untuk saya.
Terkadang setelah permintaan AJAX ada struktur DOM yang salah. Sebagai contoh:
Ini akan menyebabkan masalah juga, dan ckEditor tidak akan berfungsi. Jadi, pastikan Anda memiliki struktur DOM yang benar.
sumber
saya memiliki masalah yang sama dengan contoh, saya mencari di mana-mana dan akhirnya penerapan ini berfungsi untuk saya:
sumber
Anda dapat menghapus instance ckeditor apa pun dengan menghapus metode ckeditor. Instance akan menjadi id atau nama textarea.
sumber
Memang, menghapus kelas ".ckeditor" dari kode Anda memecahkan masalah. Sebagian besar dari kita mengikuti contoh integrasi jQuery dari dokumentasi ckeditor:
dan berpikir "... mungkin saya bisa menyingkirkan atau bagian '.jquery_'".
Saya telah membuang-buang waktu saya untuk mengutak-atik fungsi panggilan balik (karena {skin: 'office2003'} benar-benar berfungsi), sementara masalahnya datang dari tempat lain.
Saya pikir dokumentasi harus menyebutkan bahwa penggunaan "ckeditor" sebagai nama kelas tidak disarankan, karena ini adalah kata kunci yang dipesan.
Bersulang.
sumber
Saya belajar itu
hapus CKEDITOR.instances [editorName];
dengan sendirinya, benar-benar menghapus instance tersebut. SEMUA metode lain yang telah saya baca dan lihat, termasuk apa yang ditemukan di sini di stackoverflow dari penggunanya, tidak berhasil untuk saya.
Dalam situasi saya, saya menggunakan panggilan ajax untuk menarik salinan konten yang dililitkan di sekitar dan. Masalahnya terjadi karena saya menggunakan acara jQuery .live untuk mengikat tautan "Edit dokumen ini" dan kemudian menerapkan contoh ckeditor setelah keberhasilan pemuatan ajax. Artinya, ketika saya mengklik tautan lain sebuah tautan dengan acara .live lain, saya harus menggunakan hapus CKEDITOR.instances [nama editor] sebagai bagian dari tugas saya untuk membersihkan jendela konten (menahan formulir), kemudian mengambil kembali konten yang ditahan di database atau resource lain.
sumber
Saya mengalami masalah yang sama dengan jQuery Dialog.
Mengapa menghancurkan instance jika Anda hanya ingin menghapus data sebelumnya?
sumber
Saya memilih untuk mengganti nama semua instance daripada menghancurkan / mengganti - karena terkadang instance yang dimuat AJAX tidak benar-benar menggantikan yang ada di inti halaman ... menyimpan lebih banyak di RAM, tetapi lebih sedikit konflik dengan cara ini.
sumber
Saya berada dalam situasi di mana saya harus mengontrol dialog spawn, masing-masing harus memiliki ckeditor yang disematkan di dalam dialog ini. Dan kebetulan area teks berbagi id yang sama. (biasanya ini adalah praktik yang sangat buruk, tetapi saya memiliki 2 jqGrid, satu dari item yang ditetapkan dan satu lagi dari item yang belum ditetapkan.) Mereka berbagi konfigurasi yang hampir sama. Jadi, saya menggunakan kode umum untuk mengkonfigurasi keduanya.
Jadi, ketika saya memuat dialog, untuk menambahkan baris, atau untuk mengeditnya, baik dari jqGrid; Saya harus menghapus semua contoh CKEDITOR di semua area teks.
Ini akan mengulang semua textarea, dan jika ada instance CKEDITOR, maka hancurkan.
Atau jika Anda menggunakan jQuery murni:
sumber
hapus
class="ckeditor"
, itu mungkin telah memicu inisialisasi ckeditorsumber
Saya memiliki masalah yang sama ketika saya menerima pengecualian referensi null dan kata "null" akan ditampilkan di editor. Saya mencoba beberapa solusi, termasuk memutakhirkan editor ke 3.4.1 tetapi tidak berhasil.
Saya akhirnya harus mengedit sumbernya. Di sekitar baris 416 hingga 426 di _source \ plugins \ wysiwygarea \ plugin.js, ada cuplikan seperti ini:
Setidaknya di FF, iframe tidak sepenuhnya dibuat pada saat diperlukan. Saya mengepung sisa fungsi setelah baris itu dengan fungsi setTimeout:
Teks sekarang dirender secara konsisten dalam dialog modal.
sumber
Untuk mendukung pemuatan dinamis (Ajax) formulir (tanpa penyegaran halaman antara) yang berisi area teks dengan yang sama (formulir yang sama disebut lagi) atau ID yang berbeda (formulir yang sebelumnya dibongkar) dan mengubahnya menjadi elemen CKEditor, saya melakukan hal berikut (menggunakan JQuery adaptor):
Setelah halaman menyelesaikan setiap panggilan Ajax yang mengirimkan textarea untuk dikonversi, saya melakukan panggilan ke fungsi berikut:
Ini terlihat seperti ini (mengasumsikan textareas Anda akan dikonversi ke RTE memiliki class = "yourCKClass" ):
Saya harus menyebutkan bahwa baris:
bisa (dan seharusnya) sederhana:
namun saya menemukan bahwa editor akan sering menampilkan konten yang benar sesaat setelah memuat dan mereka mengosongkan editor dari konten yang diinginkan. Jadi baris dengan kode panggilan balik memaksa konten CKEditor menjadi sama dengan konten textarea asal. Menyebabkan flicker saat digunakan. Jika Anda tidak dapat menggunakannya, lakukanlah ..
sumber
Saya memiliki masalah yang persis sama seperti jackboberg. Saya menggunakan pemuatan bentuk dinamis ke dalam dialog jquery kemudian melampirkan berbagai widget (datepickers, ckeditors dll ...). Dan saya mencoba semua solusi yang disebutkan di atas, tidak ada yang berhasil untuk saya.
Untuk beberapa alasan ckeditor hanya melampirkan pertama kali saya memuat formulir, kedua kalinya saya mendapat pesan kesalahan yang sama persis seperti yang dilakukan jackboberg.
Saya telah menganalisis kode saya dan menemukan bahwa jika Anda memasang ckeditor di "tengah-udara" saat konten formulir masih belum ditempatkan ke dalam dialog, ckeditor tidak akan memasang bindingnya dengan benar. Itu karena ckeditor dipasang di "udara-tengah", kedua kali Anda memasangnya di "udara" ... poof ... kesalahan muncul karena contoh pertama tidak dihapus dengan benar dari DOM.
Ini adalah kode saya yang menyebabkan kesalahan:
Ini adalah perbaikan yang berhasil:
sumber
Saya mengalami hal yang persis sama dan masalahnya adalah plugin wordcount terlalu lama untuk diinisialisasi. 30+ detik. Pengguna akan mengklik tampilan yang menampilkan ckeditor, lalu membatalkan, dengan demikian ajax memuat halaman baru ke dalam dom. Plugin mengeluh karena iframe atau konten apa pun yang ditunjuk oleh contentWindow tidak lagi terlihat pada saat ia siap untuk menambahkan dirinya sendiri ke contentWindow. Anda dapat memverifikasi ini dengan mengklik ke tampilan Anda dan kemudian menunggu Word Count muncul di kanan bawah editor. Jika Anda membatalkan sekarang, Anda tidak akan mendapat masalah. Jika Anda tidak menunggu, Anda akan mendapatkan i.contentWindow is null error. Untuk memperbaikinya, cukup hapus plugin:
Jika Anda memerlukan penghitung kata, daftarkan acara tempel dan keyup di editor dengan fungsi yang menghitung kata.
sumber
Bagi mereka yang menggunakan jquery "adapter" dan mengalami masalah (seperti dulu), solusi yang sangat hackish namun berfungsi adalah melakukan sesuatu seperti ini:
Poin utamanya adalah bagian ini:
Ini memperbaiki masalah teks editor yang tidak terlihat saat Anda membuka dialog di lain waktu. Saya menyadari ini sangat hackish, tetapi mengingat bahwa sebagian besar akan digunakan untuk alat admin, saya rasa itu bukan masalah besar seperti biasanya .. dan ini berfungsi, jadi semoga ini akan menyelamatkan seseorang. waktu;)
sumber
Ini adalah kode yang berfungsi penuh untuk jquery .load () api dan ckeditor, dalam kasus saya, saya memuat halaman dengan ckeditor ke div dengan beberapa efek jquery. Saya harap ini akan membantu Anda.
sumber
Ini sangat sederhana. Dalam kasus saya, saya menjalankan metode jquery di bawah ini yang akan menghancurkan instance ckeditor selama pemuatan halaman. Ini melakukan trik dan menyelesaikan masalah -
Metode JQuery -
Itu dia. Saya harap ini membantu Anda.
Cheers, Sirish.
sumber
Fungsi ini berfungsi untuk saya di CKEditor versi 4.4.5, tidak ada kebocoran memori
// panggil fungsi ini seperti di bawah
sumber
CKeditor 4.2.1
Ada banyak jawaban di sini tetapi bagi saya saya membutuhkan sesuatu yang lebih (agak kotor juga jadi jika ada yang bisa meningkatkan tolong lakukan). Bagi saya MODAL dimana masalah saya.
Saya merender CKEditor dalam sebuah modal, menggunakan Foundation. Idealnya saya akan menghancurkan editor setelah menutupnya, namun saya tidak ingin mengacaukan Foundation.
Saya menelepon hapus, saya mencoba menghapus dan metode lain tetapi inilah yang akhirnya saya selesaikan.
Saya menggunakan textarea untuk mengisi bukan DIV.
Solusi Saya
ini adalah metode saya untuk mengembalikan pemformatan spesifik saya, yang mungkin tidak Anda inginkan.
sumber
Coba ini:
sumber