2013-04-17 11 views
7

Mam wbudowane kilka niestandardowych wtyczek, ale tylko jeden słucha kluczowych zdarzeń na klawiaturze. Poniżej w kodzie widoczny jest zestaw ustawień do ustawiania zdarzeń. (i jest to trochę podstawowa)CKEDITOR.setData zapobiega dołączaniu zdarzeń z funkcją .on

Teraz mam następujący problem, że jeśli ustawiam moje dane z editor.setData w instancjiOdpowiedni słuchacz. że funkcje .on nie są ustawione.

Próbowałem zastąpić contentDom zdarzeniem instanceReady, ale to też nie naprawi.

jeśli ustawiam dane manualnie za pomocą: editor.document.getBody(). SetHtml (html), nie ma żadnych problemów. i wszystkie zdarzenia są dołączone bez żadnych problemów.

CKEDITOR.plugins.add('myPlugin', { 
    lang: '', // %REMOVE_LINE_CORE% 

    init: function(editor) { 

     //Bind events if the Dom is ready! 
     editor.on('contentDom', function() 
     { 
       //keydown 
       editor.document.on('keydown', function(e) 
       { 

Czy ktoś wie, dlaczego tak się dzieje? Czy funkcja setData ustawia tylko kod HTML, czy też ponownie załaduje edytor lub coś takiego?

Zrobiłem to obejrzenie Ckeditor Source Ale myślę, że to nie jest kod, który ma coś wspólnego z funkcją setData.

Nie proszę o rozwiązanie. Chciałbym zrozumieć, dlaczego tak się dzieje.

Odpowiedz

12

Editor#contentDom jest uruchamiany za każdym razem, gdy tworzony jest nowy dokument wewnętrzny. W edytorze w ramce editor#setData() zastępuje się nie tylko body.innerHTML, ale cały dokument, dzięki czemu contentDom jest uruchamiany za każdym razem.

W ten sposób twój kod dodaje nowego słuchacza na każdym setData(), ale nie usuwa starego. Z niejasnych powodów żaden z tych dwóch słuchaczy nie jest obecnie uruchamiany na keydown. Dowiedziałem się o tym niedawno i nie mogę tego wyjaśnić.

W każdym razie musisz odłączyć wszystkich słuchaczy pod numerem editor#contentDomUnload. Na szczęście istnieje wygodny sposób, aby to zrobić za pomocą editable#attachListener.

editor.on('contentDom', function() { 
    var editable = editor.editable(); 

    editable.attachListener(editor.document, 'keydown', function() { 
     ... 
    }); 
}); 

Odbiornik zostanie automatycznie odłączony po następnym contentDomUnload.

Powiązane problemy