TinyMCE dengan tab ajax

Saya menggunakan komponen tab dari JQuery UI 1.8, dan saya memuat konten tab melalui ajax (konten html). Di salah satu tab ini saya menggunakan komponen tinyMCE, dan ketika saya memuat tab ini untuk pertama kalinya, tab kecil tersebut diinisialisasi dengan benar tetapi jika saya menavigasi ke tab lain dan saya mengingat tab itu lagi, tab kecil tersebut rusak.

Hal ini terjadi ketika impor tiny_mce.js berada di luar konten tab. Saat saya memindahkan impor ke panggilan tab, yang kecil tidak dimuat karena sepertinya tidak diinisialisasi.

Pertanyaannya adalah: bagaimana cara menginisialisasi kecil di tab ajax?

Terima kasih sebelumnya.


person doctore    schedule 28.09.2011    source sumber
comment
Anda perlu memanggil .tinyMCE() atau apa pun (saya sendiri tidak menggunakannya) pada elemen di fungsi lengkap/sukses AJAX Anda.   -  person Bojangles    schedule 28.09.2011
comment
Jika saya menginisialisasi tiny di konten ajax dan impor tiny_mce.js ada di dokumen induk (yang berisi tab), hanya berfungsi dengan baik untuk pertama kalinya. Jika impor .js dalam konten ajax, jangan pernah berhasil.   -  person doctore    schedule 28.09.2011


Jawaban (5)


Ketika saya mengalami masalah serupa dengan TinyMCE dan beralih di antara tab yang dimuat ajax, saya menemukan potongan kode yang luar biasa ini di Ready4State jadi saya pikir saya akan membagikannya karena saya berharap ini dapat membantu orang lain.

Tindakan ini akan menghapus semua contoh TinyMCE di laman tersebut.

var i, t = tinyMCE.editors;
for (i in t){
  if (t.hasOwnProperty(i)){
    t[i].remove();
  }
}    

Kemudian Anda dapat menginisialisasi ulang TinyMCE dengan aman.

Secara pribadi saya menjalankan kode di atas sebelum menggunakan pernyataan switch untuk menangani setiap ui.index, dan saya memiliki fungsi yang melakukan inisialisasi untuk TinyMCE. Jadi saya hanya memanggil fungsi itu di setiap pernyataan kasus yang relevan.

Semoga ini bisa membantu orang lain.

person DigiDamsel    schedule 23.03.2012
comment
Ini berhasil untuk saya. Mungkin karena saya memiliki banyak contoh tinymce di tab yang sama. - person Rooster242; 29.10.2013

Mungkin ada baiknya menginisialisasi ulang MCE kecil setiap kali Anda beralih kembali ke tab dengan editor di dalamnya. Anda dapat menggunakan acara "pilih" pada objek tab.

$( ".selector" ).tabs({
  select: function(event, ui) { 
    // initialise Tiny MCE here
  }
});

Anda mungkin harus menghancurkan semua instance/referensi sebelumnya ke editor sebelum melakukan inisialisasi ulang.

person Dan Higham    schedule 28.09.2011
comment
Terima kasih atas jawaban Anda, tetapi area teks yang berisi konten tinymce dimuat melalui ajax, karena alasan ini ketika saya melakukannya, Anda mengatakan (atau kode yang setara) hanya berfungsi dengan baik pada kali pertama. Saya mencoba menghapus editor: [for (edId in tinyMCE.editors) tinyMCE.editors[edId].remove();] tetapi tidak berhasil. - person doctore; 28.09.2011
comment
Kemudian muat ulang textarea melalui ajax pada saat itu juga, setelah selesai gunakan panggilan balik dan masukkan kembali tinyMCE. - person Dan Higham; 28.09.2011
comment
Init ulang tidak berfungsi, karena alasan ini saya mengatakan itu hanya berfungsi dengan baik pada kali pertama. Jika saya memulai kembali yang kecil, ketika saya mencoba menggunakan untuk kedua kalinya, komponen mengembalikan kesalahan: pengecualian yang tidak tertangkap: [Pengecualian... Komponen mengembalikan kode kegagalan: 0x80004005 (NS_ERROR_FAILURE) [nsIDOMNSHTMLDocument.execCommand] nsresult: 0x80004005 (NS_ERROR_FAILURE ) lokasi: JS frame :: /tiny_mce/tiny_mce.js :: Q :: baris 1 data: tidak] - person doctore; 28.09.2011

Anda harus mematikan instance tinymce Anda sebelum beralih ke tab lain, jika tidak, elemen editor dengan id tersebut akan diblokir.

Hapus kontrol sebelum Anda mengganti tab menggunakan

// the_editor_id equals the id of the underliing textarea
tinyMCE.execCommand('mceRemoveControl', false, the_editor_id);
person Thariama    schedule 28.09.2011
comment
Pertama kali saya mencoba mengikuti url berikutnya: stackoverflow.com/questions/6928883/. Tapi tidak berhasil. - person doctore; 28.09.2011
comment
apa yang terjadi jika Anda menggunakan hapuskontrol? - person Thariama; 28.09.2011
comment
Saya menemukan solusinya dan saya menerbitkan postingan dengannya. Terima kasih atas jawaban anda. - person doctore; 28.09.2011

Saya menemukan solusi untuk masalah saya. Inisialisasi tinymce harus dalam event load di tab jquery, seperti ini:

$("div#tabs").tabs ({collapsible: false
                    ,selected:    -1
                    ,fx: {opacity: 'toggle'}
                    ,load: function (event, ui) {

                       // Tab with tinyMCE
                       if (ui.index == 0) {
                          tinyMCE.init({mode: "none",
                                        theme: "advanced",
                                        theme_advanced_toolbar_location: "top",
                                        theme_advanced_toolbar_align: "left"
                                       });
                          tinyMCE.execCommand ('mceAddControl', false, 'text_area_id');
                       }
                       else {
                         tinyMCE.triggerSave();
                         tinyMCE.execCommand('mceFocus', false, 'text_area_id');
                         tinyMCE.execCommand('mceRemoveControl', false, 'text_area_id');
                       }
                     }
              });

Saya harap ini membantu orang lain. Selain itu, jika konten textarea dimuat melalui ajax, perintahnya:

tinyMCE.triggerSave();

tidak diperlukan.

person doctore    schedule 28.09.2011

Ya, menghabiskan 3 jam untuk masalah yang sama hari ini... dengan Jquery UI 1.10 dan TinyMCE 4.

Masalahnya, jika tidak dipilih, konten panel ajax tidak terhapus dari DOM melainkan hanya disembunyikan. Artinya textarea bisa lebih dari 1 kali di DOM (menavigasi panel). => Kematian MCE kecil...

Tidak ada acara di Jquery 1.10 untuk menangkap "panel yang tidak dipilih". Anda harus berurusan dengan acara sebelum memuat.

Jadi idenya adalah mengosongkan setiap panel "ajax dimuat" sebelum memuat panel. Kode :

$( "#list_onglet_lecteur" ).tabs({
    beforeLoad: 
        function( event, ui ) {
            $("#list_onglet_lecteur div[role=tabpanel]").each(function(){
                if($(this).attr("id") != "list_onglet_lecteur-accueil")$(this).empty();
            });

            $(ui.panel).html('<div style="width:100%;text-align:center"><img src="/images/ajax_loader_big.gif" alt=""></img><br />Chargement de l\'onglet</div>');
            ui.jqXHR.error(function() {
                ui.panel.html("Echec du chargement de l'onglet. Merci d'actualiser la page.");
            });
    } 
})

Catatan, saya belum menemukan cara untuk membuat perbedaan antara "panel yang dimuat ajax" dan "panel yang dimuat sebelumnya"... Sayang sekali karena Anda harus menambahkan setiap id "panel yang dimuat sebelumnya" ke dalam kode...

Bagaimanapun, itu menyelesaikan masalah kecil MCE. Tidak perlu masuk ke acara load, dan gunakan perintah mceRemoveControl/mceAddControl. Cukup mulai pengeditan tinyMCE di tampilan "panel tab yang dimuat ajax":

 $(function() {   
    tinyMCE.init({
        height : 300,
        mode : "specific_textareas",
        editor_selector : "mceEditor",
        theme : "modern",
        language : 'fr_FR',
        plugins: [
            "advlist autolink lists link image charmap print preview anchor",
            "searchreplace visualblocks code fullscreen",
            "insertdatetime media contextmenu paste moxiemanager"
        ],
        toolbar: "insertfile undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image"
    }); 
});
person Lyrad    schedule 12.06.2013
comment
Hampir dua tahun kemudian, tetapi memberi +1 untuk jawaban Anda - person doctore; 30.06.2013