2013-04-17 12 views
7

Ho creato alcuni plug-in personalizzati, ma solo uno sta ascoltando gli eventi chiave della tastiera. Sotto nel codice è possibile vedere il set-up per impostare gli eventi. (ed è un po 'di base)CKEDITOR.setData impedisce il collegamento di eventi con funzione .on

Ora ho il seguente problema che se ho impostato i miei dati con editor.setData in un listener instanceReady.che le funzioni .on non sono impostate.

Ho provato a sostituire il contentDom con l'evento instanceReady, ma non è stato risolto.

se ho impostato i dati manualmente con: editor.document.getBody(). SetHtml (html), non ci sono problemi. e tutti gli eventi sono allegati senza problemi ..

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) 
       { 

Qualcuno sa perché questo sta accadendo? La funzione setData imposta solo l'html o ricarica anche l'editor o qualcosa del genere?

Ho dato un'occhiata a questo Ckeditor Source Ma penso che questo non è un codice che ha qualcosa a che fare con la funzione setData.

Non sto chiedendo una soluzione. Mi piace capire perché sta accadendo.

risposta

12

Editor#contentDom viene generato ogni volta che viene impostato un nuovo documento interno. Nell'editor con cornice editor#setData() sostituisce non solo lo body.innerHTML ma l'intero documento, quindi viene emesso contentDom ogni volta.

Così, il codice aggiunge nuovo listener su ogni setData() ma non rimuovi quello vecchio. Per motivi non chiari nessuno di questi due ascoltatori viene ora attivato su keydown. L'ho scoperto recentemente e non posso spiegare questo fatto.

In ogni caso, è necessario scollegare tutti gli ascoltatori su editor#contentDomUnload. Fortunatamente, c'è un modo conveniente per farlo usando editable#attachListener.

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

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

Listener viene staccato automaticamente al prossimo contentDomUnload.

Problemi correlati