2012-05-29 23 views
8

Uso l'editor di Tinymce con il plugin autoresize. Il mio problema è che quando l'istanza di tinymce è inizializzata, non viene ridimensionata correttamente per avvolgere il contenuto in altezza.tinymce non autorizza automaticamente su init

Se si dispone di un lungo testo nell'editor (esempio 15 righe), quando viene mostrato tinymce, l'area di ridimensionamento ridimensionamento ridimensionamento automatico solo per 5 righe e altre 10 righe non vengono visualizzate. Solo quando digito qualcosa nell'area dell'editor, la dimensione automatica aumenta per tutte e 15 le righe.

questo è un plugin AutoResize javascript:

/** 
* editor_plugin_src.js 
* 
* Copyright 2009, Moxiecode Systems AB 
* Released under LGPL License. 
* 
* License: http://tinymce.moxiecode.com/license 
* Contributing: http://tinymce.moxiecode.com/contributing 
*/ 

(function() { 
    /** 
    * Auto Resize 
    * 
    * This plugin automatically resizes the content area to fit its content height. 
    * It will retain a minimum height, which is the height of the content area when 
    * it's initialized. 
    */ 
    tinymce.create('tinymce.plugins.AutoResizePlugin', { 
     /** 
     * Initializes the plugin, this will be executed after the plugin has been created. 
     * This call is done before the editor instance has finished it's initialization so use the onInit event 
     * of the editor instance to intercept that event. 
     * 
     * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in. 
     * @param {string} url Absolute URL to where the plugin is located. 
     */ 
     init : function(ed, url) { 
      var t = this, oldSize = 0; 

      if (ed.getParam('fullscreen_is_enabled')) 
       return; 

      /** 
      * This method gets executed each time the editor needs to resize. 
      */ 
      function resize() { 
       var deltaSize, d = ed.getDoc(), body = d.body, de = d.documentElement, DOM = tinymce.DOM, resizeHeight = t.autoresize_min_height, myHeight; 

       // Get height differently depending on the browser used 
       myHeight = tinymce.isIE ? body.scrollHeight : (tinymce.isWebKit && body.clientHeight == 0 ? 0 : body.offsetHeight); 

       // Don't make it smaller than the minimum height 
       if (myHeight > t.autoresize_min_height) 
        resizeHeight = myHeight; 

       // If a maximum height has been defined don't exceed this height 
       if (t.autoresize_max_height && myHeight > t.autoresize_max_height) { 
        resizeHeight = t.autoresize_max_height; 
        body.style.overflowY = "auto"; 
        de.style.overflowY = "auto"; // Old IE 
       } else { 
        body.style.overflowY = "hidden"; 
        de.style.overflowY = "hidden"; // Old IE 
        body.scrollTop = 0; 
       } 

       // Resize content element 
       if (resizeHeight !== oldSize) { 
        deltaSize = resizeHeight - oldSize; 
        DOM.setStyle(DOM.get(ed.id + '_ifr'), 'height', resizeHeight + 'px'); 
        oldSize = resizeHeight; 

        // WebKit doesn't decrease the size of the body element until the iframe gets resized 
        // So we need to continue to resize the iframe down until the size gets fixed 
        if (tinymce.isWebKit && deltaSize < 0) 
         resize(); 
       } 
      }; 

      t.editor = ed; 

      // Define minimum height 
      t.autoresize_min_height = parseInt(ed.getParam('autoresize_min_height', ed.getElement().offsetHeight)); 

      // Define maximum height 
      t.autoresize_max_height = parseInt(ed.getParam('autoresize_max_height', 0)); 

      // Add padding at the bottom for better UX 
      ed.onInit.add(function(ed){ 
       ed.dom.setStyle(ed.getBody(), 'paddingBottom', ed.getParam('autoresize_bottom_margin', 50) + 'px'); 
      }); 

      // Add appropriate listeners for resizing content area 
      ed.onChange.add(resize); 
      ed.onSetContent.add(resize); 
      ed.onPaste.add(resize); 
      ed.onKeyUp.add(resize); 
      ed.onPostRender.add(resize); 

      if (ed.getParam('autoresize_on_init', true)) { 
       ed.onLoad.add(resize); 
       //ed.onLoadContent.add(resize); 
       ed.onLoadContent.add(function(ed, l) { 
        resize(); 

         // Because the content area resizes when its content CSS loads, 
         // and we can't easily add a listener to its onload event, 
         // we'll just trigger a resize after a short loading period 
         setTimeout(function() { 
          resize(); 
         }, 400); 

       }); 
      } 

      // Register the command so that it can be invoked by using tinyMCE.activeEditor.execCommand('mceExample'); 
      ed.addCommand('mceAutoResize', resize); 
     }, 

     /** 
     * Returns information about the plugin as a name/value array. 
     * The current keys are longname, author, authorurl, infourl and version. 
     * 
     * @return {Object} Name/value array containing information about the plugin. 
     */ 
     getInfo : function() { 
      return { 
       longname : 'Auto Resize', 
       author : 'Moxiecode Systems AB', 
       authorurl : 'http://tinymce.moxiecode.com', 
       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autoresize', 
       version : tinymce.majorVersion + "." + tinymce.minorVersion 
      }; 
     } 
    }); 

    // Register plugin 
    tinymce.PluginManager.add('autoresize', tinymce.plugins.AutoResizePlugin); 
})(); 

è presente una soluzione:

     // Because the content area resizes when its content CSS loads, 
        // and we can't easily add a listener to its onload event, 
        // we'll just trigger a resize after a short loading period 
        setTimeout(function() { 
         resize(); 
        }, 400); 

ma una soluzione timer non è un bello perché iniziare in piccolo in altezza, così poi dopo Area di contenuto di stagno di 400 ms autorizza correttamente. Esiste una soluzione alternativa o come posso risolverlo?

risposta

7

È possibile perfezionare un po 'la soluzione del timer. Che cosa succede se sei su un computer lento e in realtà non è caricato in 400 ms? O un computer veloce dove 400ms è eoni? Sto usando questo nel mio codice al di fuori del plugin. Dovrebbe ridurre al minimo il ritardo nel mostrare la scatola più piccola.

// assuming mytextarea is a jquery element instance containing your tinymce. 

f = function(){ 
    if(mytextarea.tinymce()){ 
    mytextarea.tinymce().execCommand('mceAutoResize') 
    }else{ 
    setTimeout(f, 10) 
    } 
} 
f() 
0
init_instance_callback: function (ed) 
{ 
     setTimeout(function() 
     { 
      ed.execCommand('mceAutoResize', false, undefined, {skip_focus: true, skip_undo: true}); 
     }, 1); 
},