【问题标题】:Loading Multiple TinyMCE instances is freezing the browser, solution?加载多个 TinyMCE 实例会冻结浏览器,解决方案?
【发布时间】:2026-01-18 20:40:02
【问题描述】:

我有一个同时运行多个tinymce 实例的页面,它在加载时冻结浏览器。我需要等待不少于 15 秒才能再次使用浏览器。我已经在 IE9、FF6 和 Chrome 上对此进行了测试,所有这些都在加载时冻结了一段时间。

我怎样才能防止这种冻结发生?我在一页中至少有 10 个带有 tinymce 的 textarea。计算机在 core2duo 上运行,内存为 4GB,没有运行任何其他程序,但这无关紧要,因为它应该可以在低规格的 PC 上运行。

编辑添加 JS 代码以加载 TinyMCE。

<script type="text/javascript">
var myTextbox = "10 name of textarea here";

tinyMCE.init({
    // General options
    mode : "exact",
    elements: myTextbox,
    theme : "advanced",
    plugins : "paste,ibrowser",
    paste_remove_styles: true,
    paste_auto_cleanup_on_paste : true,
    plugins : "autolink,lists,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template,wordcount,advlist,autosave",
    // Theme options
    theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,styleselect,formatselect,fontselect,fontsizeselect",
    theme_advanced_buttons2 : "bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code,|,insertdate,inserttime,preview,|,forecolor,backcolor",
    theme_advanced_buttons3 : "tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,print,|,ltr,rtl,|,fullscreen",
    theme_advanced_buttons4 : "insertlayer,moveforward,movebackward,absolute,|,styleprops,|,cite,abbr,acronym,del,ins,attribs,|,visualchars,nonbreaking,template,pagebreak,restoredraft,|,charmap,emotions,iespell,media,advhr,",
    theme_advanced_buttons5 : "pastetext,pasteword,selectall,iuploader,upload_status",
    theme_advanced_toolbar_location : "top",
    theme_advanced_toolbar_align : "left",
    theme_advanced_statusbar_location : "bottom",
    theme_advanced_resizing : true,

    setup : function(ed) {
    //IMAGE UPLOADER BUTTON 
    ed.addButton('iuploader', {
        title : 'Upload Image',
        image : '/www/images/admin/post_button_image_upload.gif',
        onclick : function() {
            load_image_uploader(this.id);
         }
      }),
    ed.addButton('upload_status', {
        title : 'Upload Status',
        image : '',
        onclick : function() {

         }
      });
    },

    // Content CSS
    content_css : "/www/js/tiny_mce/css/content.css",

    // Drop lists for link/image/media/template dialogs
    template_external_list_url : "lists/template_list.js",
    external_link_list_url : "lists/link_list.js",
    external_image_list_url : "lists/image_list.js",
    media_external_list_url : "lists/media_list.js",

    // Style formats
    style_formats : [
        {title : 'Bold text', inline : 'b'},
        {title : 'Red text', inline : 'span', styles : {color : '#ff0000'}},
        {title : 'Red header', block : 'h1', styles : {color : '#ff0000'}},
        {title : 'Example 1', inline : 'span', classes : 'example1'},
        {title : 'Example 2', inline : 'span', classes : 'example2'},
        {title : 'Table styles'},
        {title : 'Table row 1', selector : 'tr', classes : 'tablerow1'}
    ],

    // Replace values for the template plugin
    template_replace_values : {
        username : "Some User",
        staffid : "991234"
    }

});

【问题讨论】:

  • 如何您将 Tinymce 编辑器实例分配给 textarea 元素?请发布您的代码。
  • 添加了将tinymce加载到相关页面的JS代码。
  • 我怀疑将 10 多个文本区域全部转换为 TinyMCE 会成为问题,因为在每种情况下,都需要创建一个新的 TinyMCE 实例。您是否考虑过只为最终用户想要使用的文本区域打开 TinyMCE(比如使用“编辑”按钮或 onclick 事件),而不是在页面加载时打开所有这些?
  • 确保所有 html 元素('myTextbox')都有不同的 id

标签: php javascript ajax mootools tinymce


【解决方案1】:

Brett Henderson 是对的,加载 10 个实例需要时间。但是,您永远不会一次编辑 10 个,因此仅针对用户想要使用的区域打开 TinyMCE 即可。

在点击时为所有文本区域创建 TinyMCE 实例的代码:

$$('textarea').each(function(e) {
    e.addEvent( 'click', function() {
        tinyMCE.execCommand('mceAddControl', false, e.getProperty('id')) ;
    });
});

并将模式更改为无:

tinyMCE.init({
    // General options
    mode : "none",

    /* 
       other options etc 
    */

});

【讨论】:

  • 我们做了类似的事情,但这样更好。如果我们要进行更新,我会将其更改为这种方法。谢谢!
  • 您知道如何使用 Tiny-React 完成此操作吗?它们在页面加载时或每次重新呈现组件时都会被初始化,但我无法在单击它们时初始化它们。
【解决方案2】:
tinyMCE.init({
            mode : "exact",
            elements : "ajaxfilemanager, ajaxfilemanager_1",
            theme : "advanced", ....



<textarea id="ajaxfilemanager" name="ajaxfilemanager" style="width: 100%; height: 500px" ></textarea>
<textarea id="ajaxfilemanager1" name="ajaxfilemanager_1" style="width: 100%; height: 500px" ></textarea>

【讨论】:

    【解决方案3】:

    我使用单击事件在单击的文本区域上加载 tinyMCE,这有助于我在同一页面上使用多个 tinyMCE 编辑器而不会冻结浏览器,这可能不是正确的方法,但它对我有用。代码:

                $('textarea').click(function(){
                    $(this).addClass("tinyopen");
                    //tinyMCE -------------
                        tinyMCE.init({
    
                            mode : "specific_textareas",
                            editor_selector : "tinyopen",
    
                            //  -----  Here comes your plugins and themes --------- //
                            //                                                      //  
                            //                                                      //  
                            //                                                      //
                            //  --------------------------------------------------- //
    
                            content_css : "path to css"
    
                        });
                    //tinyMCE -------------
                });
    

    【讨论】:

      【解决方案4】:

      问题在于 TinyMCE 加载的 iframe 与您的实例一样多。在您的情况下,更好的选择可能是使用内联版本 https://www.tiny.cloud/docs/demo/inline/

      【讨论】:

        最近更新 更多