CKEditor örneği zaten var


99

Formları sunmak için jquery iletişim kutuları kullanıyorum (AJAX aracılığıyla getirildi). Bazı formlarda metin alanları için bir CKEditor kullanıyorum. Editör ilk yüklemede iyi görüntüler.

Kullanıcı iletişim kutusunu iptal ettiğinde, içeriği daha sonraki bir talepte yeni yüklenmeleri için kaldırıyorum. Sorun, diyalog yeniden yüklendiğinde, CKEditor editörün zaten var olduğunu iddia ediyor.

uncaught exception: [CKEDITOR.editor] The instance "textarea_name" already exists.

API, mevcut düzenleyicileri yok etmek için bir yöntem içeriyor ve bunun bir çözüm olduğunu iddia eden insanlar gördüm:

if (CKEDITOR.instances['textarea_name']) {
CKEDITOR.instances['textarea_name'].destroy();
}
CKEDITOR.replace('textarea_name');

Bunun yerine yeni bir hata aldığım için bu benim için çalışmıyor:

TypeError: Result of expression 'i.contentWindow' [null] is not an object.

Bu hata, "replace ()" yerine "destroy ()" üzerinde oluşuyor gibi görünüyor. Bunu deneyimleyen ve farklı bir çözüm bulan var mı?

Mevcut düzenleyiciyi yok etmek ve değiştirmek yerine 'yeniden işlemek' mümkün mü?

GÜNCELLENDİ İşte aynı problemle ilgili başka bir soru , ancak indirilebilir bir test durumu sağladı .

Yanıtlar:


101

Bunun çalışması için , örneği yok ederken boole parametresini true olarak iletmeniz gerekir :

    var editor = CKEDITOR.instances[name];
    if (editor) { editor.destroy(true); }
    CKEDITOR.replace(name);

2
"Doğru" seçenekler büyük fark yaratır. Ayrıca aşağıda verilen "CKEDITOR.remove (instance)" cevabının da hata üretebilen dahili bir API olduğu için iyi bir çözüm olmadığını belirtmekte fayda var, instance.destroy (true) kullanmak her zaman daha iyidir
Bala Clark

Teşekkür ederim, bu gerçekten bana yardımcı oluyor.
tamamlanmamış

6
Teşekkürler korosuna katılmak! Stack Overflow'un her zaman tüm sorunlarımı tek bir aramayla çözmesini seviyorum.
Tommi Forsström

1
Bu cevap ÇOK yararlı, burada bu kadar derin gömülü olmasına şaşırdım.
Petr Vostrel

2
Cevapları aldıkları oy sayısına göre sıralama seçeneği olmalıydı .. böylece en iyi cevaplar en üste gelir.
shasi kanth

28
function loadEditor(id)
{
    var instance = CKEDITOR.instances[id];
    if(instance)
    {
        CKEDITOR.remove(instance);
    }
    CKEDITOR.replace(id);
}

Bu beni biraz kederlendirdi, ancak çözümünüz yardımcı oldu. Teşekkürler!
Ben Scheirman

Ben yukarıdaki kodu eklendi nerede sayfadaki CKEditor üç örneği, ilki diğer ikisini gösteren değildi ama vardı içinde ateş benzer bir sorun vardı ve tüm teh editörler artık görünür
Craig Angus

18
CKEDITOR.remove'ı kullanmayın çünkü yalnızca dizideki öğeyi temizler, ancak tüm DOM'u bellekte bırakır. Dokümanlarda dahili kullanım amaçlı olduğu belirtilmektedir: docs.cksource.com/ckeditor_api/symbols/CKEDITOR.html#.remove Madhaviaddanki'nin dediği gibi bunun yerine instace.destroy () kullanmanız gerekir.
AlfonsoML

2
Aynı durumla karşılaştım ve belirtildiği gibi, bu cevap yanlış. Destroy () kullanmak ve doğru parametreyi geçmek, aşağıda belirtildiği gibi nihayet benim için işe yaradı.
Mathachew

19

Bende de bu problem vardı ama çok daha basit bir şekilde çözdüm ...

CKEditor için kullanmak istediğim metin alanları için seçici olarak jQuery betiğimdeki "ckeditor" sınıfını kullanıyordum. Varsayılan ckeditor JS betiği, CKEditor için hangi metin alanlarının kullanılacağını belirlemek için bu sınıfı da kullanır.

Bu, jQuery betiğim ile varsayılan ckeditor betiği arasında bir çakışma olduğu anlamına geliyordu.

Ben sadece textarea sınıfını ve jQuery betiğimi 'do_ckeditor' olarak değiştirdim ("ckeditor" dışında herhangi bir şey kullanabilirsiniz) ve işe yaradı.


teşekkürler, evet "otomatik" ckeditoring de benimle uğraşıyordu. ayrıca bkz. stackoverflow.com/a/3631391/923817
D.Tate

11

Bu, benim için çalışan en basit (ve tek) çözümdür:

if(CKEDITOR.instances[editorName])
   delete CKEDITOR.instances[editorName];
CKEDITOR.replace(editorName);

Dizideki bu girişi silmek, bu form güvenlik kontrolünün uygulamanızı yok etmesini önler.

destroy () ve remove () benim için çalışmadı.


1
Benim için de işe yarayan tek çözüm bu, gönderdiğiniz için teşekkürler!
Michael Robinson

Çalışmak için yok ettim (). Ancak düzenleyici örneğini hiçbiri deleteveya destroy()tamamen temizlemeyin. Sözlük ve diğer ilişkili nesneler gibi şeyler hala etrafta dolaşacak.
adu

İnstance.destroy (true) denedim, ancak benim için işe yaramadı. Ama bu benim için çalıştı. Biri bana söyleyebilir mi, bunun herhangi bir yan etkisi var mı?
Alex

7

Belki bu size yardımcı olacaktır - jquery kullanarak benzer bir şey yaptım, ancak bilinmeyen sayıda ckeditor nesnesi yüklüyorum. Buna rastlamak biraz zaman aldı - belgelerde net değil.

function loadEditors() {
    var $editors = $("textarea.ckeditor");
    if ($editors.length) {
        $editors.each(function() {
            var editorID = $(this).attr("id");
            var instance = CKEDITOR.instances[editorID];
            if (instance) { instance.destroy(true); }
            CKEDITOR.replace(editorID);
        });
    }
}

Ve işte editörlerden içeriği almak için çalıştırdığım şey:

    var $editors = $("textarea.ckeditor");
    if ($editors.length) {
        $editors.each(function() {
            var instance = CKEDITOR.instances[$(this).attr("id")];
            if (instance) { $(this).val(instance.getData()); }
        });
    }

GÜNCELLEME : Doğru yöntemi kullanmak için cevabımı değiştirdim - yani .destroy (). .remove () dahili olması amaçlanmıştır ve bir noktada yanlış bir şekilde belgelenmiştir.


Bu, hataları ortadan kaldırmış gibi görünüyor, ancak ikinci işlemde metin alanı artık 'boş' içeriyor ve artık araç çubuğu veya metin alanıyla etkileşim kuramıyorum. Araç çubuğu düğmelerine tıklarsam şu hatalar alıyorum: "TypeError: İfadenin sonucu 'this. $. Focus' [tanımsız] bir işlev değil" -veya- "TypeError: 'this.document.getWindow () ifadesinin sonucu . $ '[tanımsız] bir nesne değil ". Bu işlevi nerede / ne zaman çağırıyorsunuz? Komut dosyamı jquery yüklenen içerikle aynı hizaya getirdim. (ckeditor.js üst html başlığında)
jackboberg

Buna tüm metin alanları sayfaya eklendikten ve içerikle doldurulduktan sonra diyorum.
ScottE

5

Ajax aracılığıyla yüklenen içerik için birkaç CKeditor örneği oluşturduğumuzda benzer bir sorun yaşadım.

CKEDITOR.remove ()

DOM'u bellekte tuttu ve tüm bağlamaları kaldırmadı.

CKEDITOR.instance [örnek_kimliği] .destroy ()

Hata verdi i.contentWindow ajax gelen yeni verilerle yeni bir örneğini oluşturduğunuzda, hatayı. Ancak bu, DOM'u temizledikten sonra örneği yok ettiğimi anlayıncaya kadar oldu.

Örneği ve DOM'u sayfada varken destroy () kullanın , bu durumda mükemmel şekilde çalışır.


5

Ajax istekleri için,

 for(k in CKEDITOR.instances){
    var instance = CKEDITOR.instances[k];
    instance.destroy()
 }
  CKEDITOR.replaceAll();

bu alınma, belgeden tüm örnekleri kaldırır. Ardından yeni örnekler oluşturur.



3

i.contentWindow is nullHata DOM artık bir textarea bağlıydı bir editör örneğinde yok çağrılırken ortaya görünmektedir.

CKEDITORY.destroybir parametre alır noUpdate.

APIdoc şunları belirtir:

Örnek bir DOM öğesini değiştiriyorsa bu parametre, öğenin örnek içerikleriyle güncellenip güncellenmeyeceğini belirtir.

Bu nedenle, hatayı önlemek için, metin alanı öğesini DOM'dan kaldırmadan önce yok etmeyi veya var olmayan DOM öğesini güncellemeye çalışmaktan kaçınmak için destory (true) öğesini çağırın.

if (CKEDITOR.instances['textarea_name']) {
   CKEDITOR.instances['textarea_name'].destroy(true);
}

(3.6.2 sürümünü jQuery adaptörüyle kullanarak)


3

Bu benim için çalıştı:

for(name in CKEDITOR.instances)
{
  CKEDITOR.instances[name].destroy()
}

"İptal" kodunuzun buna benzer bir şey çağırdığından emin olun! Benim sorunum,
iptalimin

2
CKEDITOR.instances = new Array();

Bunu çağrılarımdan önce bir örnek oluşturmak için kullanıyorum (her sayfa yüklemesi için) Bunun bellek kullanımını nasıl etkileyip etkilemediğinden emin değilim. Bu, yalnızca bir sayfadaki tüm örnekleri değiştirmek isterseniz işe yarar.


1
Bu sayfadaki tüm çözümleri denedim ... ortamım için, işe yarayan tek çözüm bu (ancak sadece ie9'umda doğru çalışmadı) ... diğerlerinin neden çalışmadığından emin değilim ama 1 saat sonra deneme yanılma, bu benim için çalışan tek çözümdür. Bu Andrew'u gönderdiğiniz için teşekkürler.
Ronedog

2

Yukarıdaki tüm kodlara dayanarak kendi çözümümü hazırladım.

      $("textarea.ckeditor")
      .each(function () {

                var editorId = $(this).attr("id");

                try {    
                    var instance = CKEDITOR.instances[editorId];
                    if (instance) { instance.destroy(true); }

                }
                catch(e) {}
                finally {
                    CKEDITOR.replace(editorId);
                }
            });

Benim için mükemmel çalışıyor.

Bazen AJAX isteğinden sonra yanlış DOM yapısı vardır. Örnek için:

<div id="result">
   <div id="result>
   //CONTENT
   </div>
</div>

Bu da soruna neden olacak ve ckEditor çalışmayacaktır. Bu nedenle, doğru DOM yapısına sahip olduğunuzdan emin olun.


2

örneklerle aynı sorunu yaşadım, her yere bakıyordum ve sonunda bu uygulama benim için çalışıyor:



    //set my instance id on a variable

    myinstance = CKEDITOR.instances['info'];

    //check if my instance already exist

    if (myinstance) { 
        CKEDITOR.remove(info)
    }

    //call ckeditor again

    $('#info').ckeditor({
        toolbar: 'Basic',
        entities: false,
        basicEntities: false
    });

2

Herhangi bir ckeditor örneğini ckeditor'un remove yöntemiyle kaldırabilirsiniz. Örnek, metin alanının kimliği veya adı olacaktır.

if (CKEDITOR.instances[instance_name]) {
    CKEDITOR.remove(CKEDITOR.instances[instance_name]);
}

1

Aslında, kodunuzdan ".ckeditor" sınıfını kaldırmak sorunu çözer. Çoğumuz ckeditor'un belgelerinden jQuery entegrasyon örneğini takip ettik:

$('.jquery_ckeditor')
.ckeditor( function() { /* callback code */ }, { skin : 'office2003' } );

ve "... belki sadece kurtulabilirim veya '.jquery_' kısmı" diye düşündüm.

Sorun başka bir yerden gelirken geri arama işlevini ayarlamak için zamanımı boşa harcıyorum (çünkü {skin: 'office2003'} gerçekten işe yaradı).

Bence dokümantasyonda, sınıf adı olarak "ckeditor" kullanımının, ayrılmış bir anahtar kelime olduğu için tavsiye edilmediğini belirtmesi gerektiğini düşünüyorum.

Şerefe.


1

Bunu öğrendim

CKEDITOR.instances [editorName] 'i sil;

kendi başına, aslında örneği kaldırdı. Burada kullanıcılarından stackoverflow'da bulunanlar da dahil olmak üzere okuduğum ve gördüğüm diğer TÜM yöntemler benim için işe yaramadı.

Benim durumumda, ve 'ler etrafına sarılmış içeriğin bir kopyasını almak için bir ajax çağrısı kullanıyorum. Sorun şu ki, "Bu belgeyi düzenle" bağlantısını bağlamak için bir jQuery .live olayı kullanıyorum ve ardından ajax yükünün başarılı olmasından sonra ckeditor örneğini uyguluyorum. Bu, başka bir bağlantıya başka bir .live olayına tıkladığımda, içerik penceresini temizleme (formu tutma) ve ardından tutulan içeriği yeniden getirme görevimin bir parçası olarak delete CKEDITOR.instances [editorName] öğesini kullanmam gerektiği anlamına gelir. veritabanında veya diğer kaynaklarda.


1

Bir jQuery Dialog ile aynı sorunu yaşadım.

Yalnızca önceki verileri kaldırmak istiyorsanız örneği neden yok edesiniz?

function clearEditor(id)
{
  var instance = CKEDITOR.instances[id];
  if(instance)
  {
    instance.setData( '' );
  }
}

1

Yok etme / değiştirme yerine tüm örnekleri yeniden adlandırmayı seçtim - çünkü bazen AJAX yüklü örnek sayfanın çekirdeğindekinin yerini almaz ... RAM'de daha fazlasını tutar, ancak bu şekilde daha az çakışma.

    if (CKEDITOR && CKEDITOR.instances) {
        for (var oldName in CKEDITOR.instances) {
            var newName = "ajax"+oldName;
            CKEDITOR.instances[newName] = CKEDITOR.instances[oldName];
            CKEDITOR.instances[newName].name = newName;
            delete CKEDITOR.instances[oldName];
        }
    }

1

Diyalogların ortaya çıkmasını kontrol etmem gereken bir durumdayım, her birinin bu diyalogların içine gömülü bir ckeditor olması gerekiyor. Metin alanları aynı kimliği paylaşır. (normalde bu çok kötü bir uygulamadır, ancak 2 jqGrid'im var, biri atanmış öğelerden biri ve diğeri atanmamış öğeler.) Neredeyse aynı yapılandırmayı paylaşıyorlar. Bu nedenle, her ikisini de yapılandırmak için ortak kod kullanıyorum.

Bu nedenle, satır eklemek veya düzenlemek için jqGrid'den bir iletişim kutusu yüklediğimde; Tüm metin alanlarındaki tüm CKEDITOR örneklerini kaldırmalıyım.

$('textarea').each(function()
{
    try 
    {
        if(CKEDITOR.instances[$(this)[0].id] != null)
        {
            CKEDITOR.instances[$(this)[0].id].destroy();
        }
    }
    catch(e)
    {

    }
});

Bu, tüm metin alanlarında döngü oluşturacak ve bir CKEDITOR örneği varsa, onu yok edin.

Alternatif olarak, saf jQuery kullanıyorsanız:

$('textarea').each(function()
{
    try 
    {
        $(this).ckeditorGet().destroy();
    }
    catch(e)
    {

    }
});


0

Boş bir referans istisnası aldığım ve düzenleyicide "boş" kelimesi görüntülenecek olan aynı sorunu yaşadım. Düzenleyiciyi 3.4.1'e yükseltmek de dahil olmak üzere bir dizi çözümü boşuna denedim.

Sonunda kaynağı düzenlemek zorunda kaldım. _Source \ plugins \ wysiwygarea \ plugin.js içindeki yaklaşık 416 - 426 satırlarında, şuna benzer bir pasaj var:

iframe = CKEDITOR.dom.element.createFromHtml( '&lt;iframe' + ... + '></iframe>' );

En azından FF'de, iframe ihtiyaç duyulduğunda tamamen somutlaştırılmaz. Bu satırdan sonra işlevin geri kalanını setTimeout işleviyle çevreledim:

iframe = CKEDITOR.dom.element.createFromHtml( '<iframe' + ... + '></iframe>' );
setTimeout(function()
{ 
    // Running inside of Firefox chrome the load event doesn't bubble like in a normal page (#5689)
    ...
}, 1000);

};

// The script that launches the bootstrap logic on 'domReady', so the document
...

Metin artık kalıcı iletişim kutularında tutarlı bir şekilde işleniyor.


0

Aynı (aynı form yeniden çağrılır) veya farklı kimliklere (önceden yüklenmemiş form) sahip metin alanlarını içeren formların (sayfa yenilemesiz) dinamik (Ajax) yüklemesini desteklemek ve bunları CKEditor öğelerine dönüştürmek için (JQuery'yi kullanarak) adaptör):

Sayfa, dönüştürülecek bir metin alanı sunan her Ajax çağrısını bitirdikten sonra, aşağıdaki işlevi çağırıyorum:

setupCKeditor()

Bu şuna benzer (metin alanlarınızın RTE'lere dönüştürüleceğini varsayar class = "yourCKClass" ):

    /* Turns textAreas into TinyMCE Rich Text Editors where
 * class: tinymce applied to textarea.
 */
function setupCKeditor(){

    // define editor configuration      
    var config = {skin : 'kama'};

    // Remove and recreate any existing CKEditor instances
    var count = 0;
    if (CKEDITOR.instances !== 'undefined') {
        for(var i in CKEDITOR.instances) {

            var oEditor   = CKEDITOR.instances[i];
            var editorName = oEditor.name;

             // Get the editor data.
            var data = $('#'+editorName).val();

            // Check if current instance in loop is the same as the textarea on current page
            if ($('textarea.yourCKClass').attr('id') == editorName) {
                if(CKEDITOR.instances[editorName]) {

                    // delete and recreate the editor
                    delete CKEDITOR.instances[editorName];
                    $('#'+editorName).ckeditor(function() { },config);
                    count++;

                }
            }   


        }
    }

    // If no editor's exist in the DOM, create any that are needed.             
    if (count == 0){

        $('textarea.yourCKClass').each( function(index) {

                var editorName = $(this).attr('id');
                $('#'+editorName).ckeditor(function() { $('#'+editorName).val(data); },config);

            });

    }


}

Şu satırdan bahsetmeliyim:

$('#'+editorName).ckeditor(function() { $('#'+editorName).val(data); },config);

basitçe olabilir (ve olmalıdır):

$('#'+editorName).ckeditor(function() { },config);

ancak editörün genellikle yükledikten sonra bir saniye boyunca doğru içeriği göstereceğini ve editörün istenen içeriği boşalttığını fark ettim. Böylece geri arama kodunun bulunduğu bu satır, CKEditor içeriğini kaynak metin alanı içeriğiyle aynı olmaya zorlar. Kullanıldığında titremeye neden olur. Kullanmaktan kaçınabiliyorsanız, bunu yapın ..


0

Jackboberg ile tamamen aynı sorunu yaşadım. Jquery iletişim kutularına dinamik form yükleme ve ardından çeşitli widget'lar (tarih seçici, düzenleyiciler vb.) Ekliyordum. Ve yukarıda belirtilen tüm çözümleri denedim, hiçbiri benim için işe yaramadı.

Bazı nedenlerden dolayı ckeditor sadece formu ilk yüklediğimde ekledi, ikinci kez tam olarak jackboberg'in yaptığı aynı hata mesajını aldım.

Kodumu analiz ettim ve eğer ckeditor'ı "orta havada" eklerseniz, yani form içeriği hala iletişim kutusuna yerleştirilmediyse, ckeditor'ın bağlamalarını düzgün bir şekilde eklemeyeceğini keşfettim. Bu, ckeditor "havada" eklendiğinden, ikinci kez onu "havada" taktığınızda ... puf ... İlk örnek DOM'dan düzgün şekilde kaldırılmadığı için bir hata atılır.

Hatayı ortaya çıkaran kodum buydu:

var $content = $(r.content); // jQuery can create DOM nodes from html text gotten from <xhr response> - so called "mid-air" DOM creation
$('.rte-field',$content).ckeditor(function(){});
$content.dialog();

Bu işe yarayan düzeltme:

var $content = $(r.content).dialog(); // first create dialog
$('.rte-field',$content).ckeditor(function(){}); // then attach ckeditor widget

0

Ben de aynı şeyle karşılaştım ve sorun, wordcount eklentisinin başlatılmasının çok uzun sürmesiydi. 30+ saniye. Kullanıcı, düzenleyiciyi görüntüleyen görünüme tıklar, ardından iptal eder, böylece doma yeni bir sayfa yükler. Eklenti şikayet ediyordu çünkü iframe veya contentWindow'un işaret ettiği herhangi bir şey, kendisini contentWindow'a eklemeye hazır olduğunda artık görünmüyordu. Bunu, görünümünüze tıklayarak ve ardından Düzenleyicinin sağ alt köşesinde Kelime Sayısının görünmesini bekleyerek doğrulayabilirsiniz. Şimdi iptal ederseniz bir sorun yaşamazsınız. Beklemezseniz, i.contentWindow is null hatası alırsınız. Düzeltmek için eklentiyi not edin:

if (CKEDITOR.instances['textarea_name']) 
{
   CKEDITOR.instances['textarea_name'].destroy();
}
CKEDITOR.replace('textarea_name', { removePlugins: "wordcount" } );

Bir sözcük sayacına ihtiyacınız varsa, sözcükleri sayan bir işlevle düzenleyicideki yapıştırma ve tuşlama etkinliklerine kaydolun.


0

Jquery "bağdaştırıcısını" kullanan ve sorun yaşayanlar için (benim gibi), süper bilgisayar korsanlığı ancak çalışan bir çözüm şöyle bir şey yapmaktır:

// content editor plugin
(function($){
    $.fn.contentEditor = function( params ) {
        var xParams = $.extend({}, $.fn.contentEditor.defaultParams, params);
        return this.each( function() {   
            var $editor = $(this);
            var $params = $.extend({}, xParams, $editor.data());

            // if identifier is set, detect type based on identifier in $editor
            if( $params.identifier.type ) {
                $params.type = $editor.find($params.identifier.type).val();
            }

            $editor.data('type', $params.type);

            // edit functionality
            editButton = $('<button>Edit Content</button>').on('click',function(){
                // content container
                var $cc = $('#' + $editor.data('type'));

                // editor window
                var $ew = $('<form class="editorWindow" />');
                $ew.appendTo('body');

                // editor content
                $ec = $('<textarea name="editorContent" />').val($cc.html());
                $ec.appendTo($ew);
                $ec.ckeditor();


                //$ec.ckeditorGet().setMode('source');


                $ew.dialog({
                    "autoOpen": true,
                    "modal": true,
                    "draggable": false,
                    "resizable": false,
                    "width": 850,
                    "height": 'auto',
                    "title": "Content Editor",
                    "buttons": { 
                        'Save': function() {                            
                            $cc.html( $ec.val() );
                            $ec.ckeditorGet().destroy(); 
                            $ew.remove();
                        },
                        'Cancel / Close': function() { 

                            $ec.ckeditorGet().destroy();                        
                            $ew.remove();
                        }
                    },
                    'close': function() {
                        $ec.ckeditorGet().destroy(); 
                    },
                    'open': function() {
                        $ew.find('a.cke_button_source').click();

                        setTimeout(function(){
                            $ew.find('a.cke_button_source.cke_on').click();
                        }, 500);
                    }
                });

                return false;
            });

            editButton.appendTo( $editor );

        });
    }

    // set default option values
    $.fn.contentEditor.defaultParams = {
        'identifier': {
            'type': 'input[name="type"]'
        }
    };   

})(jQuery);   

$(function(){

    $('form.contentEditor').contentEditor();

});

Bu kısımda kilit nokta:

                'open': function() {
                    $ew.find('a.cke_button_source').click();

                    setTimeout(function(){
                        $ew.find('a.cke_button_source.cke_on').click();
                    }, 500);
                }

Bu, iletişim kutusunu bir sonraki açışınızda düzenleyici metninin görünmemesi sorununu çözer. Bunun çok basit olduğunu biliyorum, ancak bunların çoğunun yönetici araçları için kullanılacağını düşünürsek, bunun normalde olacağı kadar büyük bir sorun olduğunu sanmıyorum .. ve bu işe yarıyor, bu yüzden umarım birilerini kurtarır. zaman;)


0

Bu, jquery .load () api ve ckeditor için tam olarak çalışan koddur, benim durumumda ckeditor ile bazı jquery efektleriyle div'e bir sayfa yüklüyorum. Umarım bu sana yardımcı olur.

 $(function() {
            runEffect = function(fileload,lessonid,act) {
            var selectedEffect = 'drop';
            var options = {};
            $( "#effect" ).effect( selectedEffect, options, 200, callback(fileload,lessonid,act) );
        };
        function callback(fileload,lessonid,act) {
            setTimeout(function() {//load the page in effect div
                $( "#effect" ).load(fileload,{lessonid:lessonid,act:act});
                 $("#effect").show( "drop", 
                          {direction: "right"}, 200 );
                $("#effect").ajaxComplete(function(event, XMLHttpRequest, ajaxOptions) {
                    loadCKeditor(); //call the function after loading page
                });
            }, 100 );   
        };

        function loadCKeditor()
        {//you need to destroy  the instance if already exist
            if (CKEDITOR.instances['introduction']) 
            {
                CKEDITOR.instances['introduction'].destroy();
            }
            CKEDITOR.replace('introduction').getSelection().getSelectedText();
        }
    });

===================== button for call the function ================================

<input type="button" name="button" id="button" onclick="runEffect('lesson.php','','add')" >

0

Oldukça basit. Benim durumumda, bir sayfa yükleme sırasında ckeditor örneklerini yok edecek aşağıdaki jquery yöntemini çalıştırdım. Bu hile yaptı ve sorunu çözdü -

JQuery yöntemi -

function resetCkEditorsOnLoad(){

    for(var i in CKEDITOR.instances) {
        editor = CKEDITOR.instances[i];
            editor.destroy();
            editor = null;
    }
}

$(function() {

            $(".form-button").button();
    $(".button").button();

    resetCkEditorsOnLoad(); // CALLING THE METHOD DURING THE PAGE LOAD

            .... blah.. blah.. blah.... // REST OF YOUR BUSINESS LOGIC GOES HERE

       });

Bu kadar. Umarım size yardımcı olur.

Şerefe, Sirish.


0

Bu işlev benim için CKEditor 4.4.5 sürümünde çalışıyor, herhangi bir bellek sızıntısı yok

 function CKEditor_Render(CkEditor_id) {
        var instance = CKEDITOR.instances[CkEditor_id];
        if (CKEDITOR.instances.instance) {
            CKEDITOR.instances.instance.destroy();
        }
        CKEDITOR.replace(CkEditor_id);
    }

// bu işlevi aşağıdaki gibi çağırın

var id = 'ckeditor'; // Id of your textarea

CKEditor_Render(id);

0

CKeditor 4.2.1

Burada pek çok cevap var ama benim için daha fazlasına ihtiyacım vardı (biraz da kirli, eğer biri kendini geliştirebilirse lütfen yapın). Benim için sorunumun bulunduğu MODAL'ler.

CKEditor'ı Foundation'ı kullanarak bir modelde işliyordum. İdeal olarak, kapattıktan sonra editörü hayal ederdim, ancak Foundation ile uğraşmak istemedim.

Silmeyi aradım, kaldırmayı ve başka bir yöntemi denedim ama sonunda yerleştiğim şey buydu.

DIV'leri değil, metin alanını doldurmak için kullanıyordum.

Çözümüm

//hard code the DIV removal (due to duplication of CKeditors on page however they didn't work)

    $("#cke_myckeditorname").remove();


     if (CKEDITOR.instances['myckeditorname']) {
                delete CKEDITOR.instances['myckeditorname'];
                CKEDITOR.replace('myckeditorname', GetCKEditorSettings());
            } else {
                CKEDITOR.replace('myckeditorname', GetCKEditorSettings());
            }

bu, istemeyebileceğiniz özel biçimlendirmemi döndürme yöntemimdi.

    function GetCKEditorSettings()
    {
       return {
                    linkShowAdvancedTab: false,
                    linkShowTargetTab: false,
                    removePlugins: 'elementspath,magicline',
                    extraAllowedContent: 'hr blockquote div',
                    fontSize_sizes: 'small/8px;normal/12px;large/16px;larger/24px;huge/36px;',
                    toolbar: [
                        ['FontSize'],
                        ['Bold', 'Italic', 'Underline', '-', 'NumberedList', 'BulletedList', '-', 'Link', 'Unlink'],
                        ['Smiley']
                    ]
                };
    }

0

Bunu dene:

for (name in CKEDITOR.instances)
{
    CKEDITOR.instances[name].destroy(true);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.