Estoy tratando de crear un nuevo complemento TinyMCE. ¿Hay alguna manera de obtener una devolución de llamada al código del complemento después de que init_instance_callback ya se haya ejecutado para todo el editor? Necesitaría ejecutar algún código dentro del complemento cuando esto suceda y prefiero automatizar esto dentro del complemento en lugar de documentar que se debe llamar a algún método específico del complemento desde la devolución de llamada init_instance_callback configurada por el usuario final.
¿Los eventos del editor TinyMCE al complemento están documentados en alguna parte? Supongo que es algo a lo largo de las líneas
tinymce.PluginManager.add('myplugin123', function(editor, url) { ... editor.on("some-event-name-for-init_instance_callback-complete", function (x) { // the code I would like to run goes here ... }); });Me gustaría usar la última versión de TinyMCE, en este momento parece ser la versión 5.10.2.
No creo que la devolución de llamada active un evento cuando finalice, pero puede hacerlo manualmente con su propio evento personalizado:
https://fiddle.tiny.cloud/9Uhaab/2
La parte clave es:
init_instance_callback : function(editor) { console.log('Editor: ' + editor.id + ' is now initialized.'); //Fire your own event at the end of init_instance_callback editor.fire('my_custom_event'); },La última línea dispara un evento que creas. A continuación, puede escuchar ese evento y hacer lo que necesite. En el ejemplo de Fiddle, también hago eso en la configuración de TinyMCE, pero puede hacerlo en su complemento como sugiere.
Parece que TinyMCE ejecuta el siguiente código para inicializar el editor (código fuente real para TinyMCE versión 5.10.2):
var initEditor = function (editor) { editor.bindPendingEventDelegates(); editor.initialized = true; fireInit(editor); editor.focus(true); moveSelectionToFirstCaretPosition(editor); editor.nodeChanged({ initial: true }); editor.execCallback('init_instance_callback', editor); autoFocus(editor); }; La llamada al método fireInit(editor); desencadena el evento Init para el editor y todos los detectores de eventos se ejecutarán inmediatamente (incluido cualquier complemento que haya ejecutado previamente editor.on("Init", ...) para esperar este evento).
Si ese código de complemento quiere ejecutar código después de que init_instance_callback ya se haya ejecutado, puede ejecutar
setTimeout(function() { // code to run after init_instance_callback }, 0);Esto funciona en la práctica con la implementación actual porque agregará la referencia de función al final de la cola de eventos nativos del navegador que se ejecutará cuando el código JS regrese al bucle de eventos nativos del navegador. Obviamente, esto sucede cuando el código TinyMCE ha terminado de ejecutar el código que se está ejecutando actualmente.
Tenga en cuenta que la implementación de autoFocus() activará el evento de enfoque después de un retraso codificado de 100 ms. Y autoFocus() no hará nada si editor.settings.auto_focus no es verdadero.
Tenga en cuenta que nada de esto está documentado en ninguna parte. El código fuente anterior es parte de TinyMCE 5.10.2, pero podría cambiar en el futuro, así que considere lo anterior como un truco en lugar de una función compatible adecuada.
Diría que agregar una llamada de función a través setTimeout() y escuchar el evento de focus debería ser bastante bueno. Lo que suceda primero será probablemente inmediatamente (o después de un retraso de 100 ms) después de que se haya ejecutado init_instance_callback .
Tenga en cuenta que si TinyMCE cambia el comportamiento para activar init_instance_callback a través del bucle de eventos nativo del navegador en el futuro, el truco anterior ejecutará el código demasiado pronto. Tenga en cuenta que, en ese caso, no hay un valor de retraso seguro (> 0) para esperar a que TinyMCE se ejecute primero porque, en teoría, la ejecución de JS puede detenerse durante un tiempo ilimitado entre el evento Init y la configuración del tiempo de espera para el disparador init_instance_callback . Si 0 no es un valor seguro (como con la implementación actual), cualquier valor distinto de cero tampoco es seguro.