Comment redimensionner automatiquement tinyMCE?

j'ai un TinyMCE qui est positionné sur une TextArea, et je veux que cette zone editor ocuppy tout l'espace de sa div mère, à tout moment.

j'ai une fonction JS qui récupère l'espace courant et positionne le textarea.style.mais quand J'active TinyMCE, il semble s'arrêter de fonctionner.

en outre, le textarea a la largeur: 100%; il ne redimensionne pas par le rendu HTML quand il utilise TinyMCE aussi.

des idées?

30
demandé sur igorsantos07 2009-11-25 21:45:11

11 réponses

de nos jours, vous devez utiliser le autoresize plugin qui vient avec tinyMCE. Vous devrez appeler tinyMCE comme ceci (version jQuery):

$('.tinymce').tinymce({
  theme : 'advanced',
  plugins : 'autoresize',
  width: '100%',
  height: 400,
  autoresize_min_height: 400,
  autoresize_max_height: 800,
});

j'ai fait l'expérience, qu'il peut être utile de faire manuellement appeler le redimensionnement dans le init_instance_callback pour fournir la bonne hauteur sur init. Ajoutez ce paramètre aux options passées, si vous en avez besoin:

init_instance_callback: function (inst) { inst.execCommand('mceAutoResize'); }
47
répondu bfncs 2012-09-12 07:00:13

le point est que TinyMCE génère une iframe à la place du textarea, avec cet ID: originalID+"_ifr", et une table originalID+"_tbl" pour maintenir les contrôles et la zone d'édition.

pour faire la largeur du fluide:

document.getElementById(id+'_tbl').style.width='100%'



pour faire la hauteur du fluide:

Changement dinamically
C'est le script que j'utilise:

function toScreenHeight(id, minus) {
    var height;

    if (typeof(window.innerHeight) == "number") //non-IE
        height = window.innerHeight;
    else if (document.documentElement && document.documentElement.clientHeight) //IE 6+ strict mode
        height = document.documentElement.clientHeight;
    else if (document.body && document.body.clientHeight) //IE 4 compatible / IE quirks mode
        height = document.body.clientHeight;

    document.getElementById(id).style.height = (height - minus) + "px";
}

Vous pouvez utiliser la appels de code et de fonction à l'intérieur onload et onresizebody événements.

14
répondu igorsantos07 2015-10-01 21:01:42

dans tinymce 3.4.6, set

width:'100%'

l'option init résoudra le problème.

9
répondu ZHAO Xudong 2011-10-26 04:52:15

si vous faites des MCE minuscules dynamiquement via JS, vous pouvez courir dans les problèmes de timing où l'éditeur de MCE n'est pas encore disponible pour les ajustements de style. Pour combattre cela, vous pouvez utiliser un temps d'arrêt de l'ancienne école.

dans cet exemple, j'utilise un namespace" j " pour JQuery. Si votre éditeur est dans un fluide div qui change de taille, vous pouvez l'inclure dans un $(window).redimensionner(function() { }); auditeur.

setTimeout(function(){ 
  $j('.mceEditor').css('width','100%').css('minHeight','240px');
  $j('.mceLayout').css('width','100%').css('minHeight','240px');
  $j('.mceIframeContainer').css('width','100%').css('minHeight','240px');
  $j('#'+[INSERT TEXTAREA ID HERE]+'_ifr').css('width','100%').css('minHeight','240px');
},500) 
3
répondu Noel Baron 2011-09-29 16:17:21

aucune des réponses ci-dessus ne fonctionnait pour moi dans TinyMCE v4, donc ma solution était de calculer la hauteur en se basant sur les barres d'outils/Barre de menu/barre d'état, puis de définir la hauteur de l'éditeur, en prenant ces hauteurs en considération.

function resizeEditor(myHeight) {
    window.console.log('resizeEditor');
    myEditor = getEditor();
    if (myEditor) {
        try {
            if (!myHeight) {            
                var targetHeight = window.innerHeight; // Change this to the height of your wrapper element
                var mce_bars_height = 0;
                $('.mce-toolbar, .mce-statusbar, .mce-menubar').each(function(){
                    mce_bars_height += $(this).height();
                });
                window.console.log('mce bars height total: '+mce_bars_height);                          
                myHeight = targetHeight - mce_bars_height - 8;  // the extra 8 is for margin added between the toolbars
            }
            window.console.log('resizeEditor: ', myHeight);
            myEditor.theme.resizeTo('100%', myHeight);  // sets the dimensions of the editable area
        }
        catch (err) {
        }
    }
}

dans mon cas, je voulais que la fenêtre de l'éditeur corresponde à la largeur et à la hauteur du window, puisque l'éditeur apparaîtrait dans un popup. Pour détecter les changements et redimensionner, je mets ceci à un rappel:

window.onresize = function() {
    resizeEditor();
}
3
répondu Kyle Falconer 2014-08-08 15:20:23

avec la version 4 et l'option d'utiliser la mise en page flexbox dans le navigateur j'ai fait ce qui suit pour obtenir une pleine largeur,l'expérience d'édition en hauteur de la div mère.

Il devrait être facile de mettre le css dans un fichier si vous préférez l'ajouter à vos styles existants.

var css = '.tinycme-full .mce-edit-area {display:flex;flex-flow:column;} .tinycme-full .mce-edit-area iframe {flex:1 1 auto;}  .tinycme-full {height:100%;} .tinycme-full .mce-tinymce.mce-container { width:100%;height:100%;border:0; } .tinycme-full .mce-panel{border:0} .tinycme-full .mce-container-body.mce-stack-layout {display: flex; flex-flow: column;height: 100%;} .tinycme-full .mce-stack-layout-item{  flex: 0 0 auto;} .tinycme-full .mce-edit-area{flex:1 1 auto;} ',
    head = document.head || document.getElementsByTagName('head')[0],
    style = document.createElement('style');

style.type = 'text/css';
if (style.styleSheet) {
    style.styleSheet["cssText"] = css;
} else {
    style.appendChild(document.createTextNode(css));
}

head.appendChild(style);

L'idée est qu'il fait toutes les divs nécessaires prennent autant d'espace de colonne que nécessaire pour remplir le parent 100% et son fait en mettant un div autour de votre textarea: <div class="tinycme-full"> <textarea ... /></div>

Pas de jquery ou d'autres dépendances sont nécessaires et remplissent maintenant le parent à 100%. enter image description here

2
répondu Poul K. Sørensen 2015-06-24 22:28:29

j'ai eu le même problème, après avoir lu ce fil j'ai fini avec ce code

init_instance_callback: function (inst) { 
  setTimeout(function () {
    document.getElementById(inst.id + '_ifr').style.height= (document.getElementById("theContainerDiv").offsetHeight-85) + 'px';
   },1000);
},

je redimensionne l'élément " _ifm "au lieu de" _tbl", puisque redimensionner" _tbl " ne redimensionne pas la zone d'édition pour moi. Puis je laisse de l'espace pour la barre d'outils et la barre de statut en faisant les "_ifr" 85 pixels plus courts que le conteneur div.

j'ai dû utiliser setTimeout pour que ça marche, peut-être parce que j'ai une animation qui affiche l'élément conteneur.

1
répondu emmanuel2004 2013-03-05 12:23:40

SyCoDeR a raison mais j'ai suivi un chemin légèrement différent bien que probablement avec les mêmes résultats.

/*Container, container body, iframe*/
.mce-tinymce, .mce-container-body, #code_ifr {
    min-height: 100% !important;
}
/*Container body*/
.mce-container-body {
    position: absolute;
    bottom: 0;
    left: 0;
    right: 0;
}
/*Editing area*/
.mce-container-body .mce-edit-area {
    position: absolute;
    top: 69px;
    bottom: 37px;
    left: 0;
    right: 0;
}
/*Footer*/
.mce-tinymce .mce-statusbar {
    position: absolute;
    bottom: 0;
    left: 0;
    right: 0;
}

révisé parce que TinyMCE modifie les id avec des ajouts ou des suppressions menu/barre d'outils. Cela fonctionne peu importe ce que vous en faites.

1
répondu liquibyte 2015-03-27 02:48:44

le wrapper d'iframe (son ID fini par _ifr) est le premier parent de span qu'il a une application en tant que rôle . Ainsi, pour obtenir l'emballage:

$('span[role=application]').parents(':eq(0)')

Donc pour Redimensionner la hauteur:

$('[id$=_ifr]').css('height',$('span[role=application]').parents(':eq(0)').css('height'))

Pour redimensionner la largeur

$('[id$=_ifr]').css('width',$('span[role=application]').parents(':eq(0)').css('width'))
0
répondu Abdennour TOUMI 2013-04-29 01:25:12

j'utilise une solution CSS pure pour y parvenir (tinyMCE 4.0.20).

  1. Régler la hauteur de l'iframe à 100%:

    tinymce.initialisation({ hauteur: '100%' })

  2. ajouter des styles à redimensionner automatiquement le conteneur iframe:

    .mce-tinymce { height: auto; width: 100%; position: absolute; left: 0; top: 0; bottom: 0; }

    .bq-éditeur .mce-conteneur-Caisse { hauteur: 100%; }

    .bq-éditeur .mce-edit-area { position: absolute; top: 57px; bottom: 0; width: 100%; height: auto; }

Remarque: j'ai une barre d'outils ligne et haut: 57px; dans .bq-éditeur .mce-modifier la zone est de la barre d'outils de rembourrage.

0
répondu SyCoDeR 2014-07-30 10:59:50

voici ma solution: (ajouté img max-width pour les images responsive)

initialisation

   setup: function(editor) { 
        editor.on('init', function (e) { 
            $("#editor_textarea_ifr").contents().find('img').css("max-width","100%");
            iframeHeight = $("#editor_textarea_ifr").contents().find("html").height();            
            $("#editor_textarea_ifr").css("height",iframeHeight + 100);                     
        });             
    },

sur le nœud de changement (modifications)

  init_instance_callback: function (editor) {
    editor.on('NodeChange', function (e) {
      $("#editor_textarea_ifr").contents().find('img').css("max-width","100%");               
      iframeHeight = $("#editor_textarea_ifr").contents().find("html").height();              
      $("#editor_textarea_ifr").css("height",iframeHeight + 100);   
    });
}   
0
répondu DobotJr 2018-02-16 16:21:06