【问题标题】:TinyMCE instances in jquery sortablejQuery 中的 TinyMCE 实例可排序
【发布时间】:2010-10-13 00:02:21
【问题描述】:

我感到很沮丧和沮丧,所以是时候寻求帮助了。做了很多谷歌搜索,但还没有找到适合我的解决方案。

我所拥有的是一大堆可以使用 Jquery 可排序的 div,其中一些 div 包含一个 TinyMCE 实例。在您尝试移动包含 TinyMCE 实例的 div 之前,这一切都很好 - 当您这样做时,TinyMCE 似乎会刷新自身并创建一个新实例,然后您会丢失数据等。然后整个页面因 javascript 不再中断作品:)。在此期间,我在 Firebug 中遇到 javascript 构造函数错误等。

我决定最好的方法是当 div 开始被拖动时从文本区域中删除 tinymce,当它被放置在它的新位置时插入 tinymce。

我可以很好地删除它,但无法重新添加它 - 因为我遇到更多构造函数错误。

注意:TinyMCE 会自动添加到我正在使用的系统中的所有文本区域,因此尽量避免与 TinyMCE 混淆。

在下面的代码中,我只是针对特定的 textarea id 进行测试。

$cols.sortable({
                            cursor: 'move',
                            revert: true,
                            opacity: 0.6,
                            placeholder: 'widgetplaceholder',
                            forcePlaceholderSize: true,
                            connectWith: cols,
                            zIndex:9000,
                            cancel: ".collapsable_box_editpanel_groups, .collapsable_box_content",
                            start: function(e, ui) {
                                     // removes tinymce ok from textarea
                                     tinyMCE.execCommand( 'mceRemoveControl', false, 'textarea1' );

                            },
                            stop: function(e,ui) {
                                    // breaks here - constructor error
                                    tinyMCE.execCommand( 'mceAddControl', true, 'textarea1' );
                                    $(this).sortable( "refresh" );
                            }
                    });

其他人有其他解决方案吗?如果您需要更多信息,请告诉我:)

【问题讨论】:

    标签: jquery tinymce sortables


    【解决方案1】:

    如果您的 MCE 实例中已经有数据,为避免丢失,您可以试试这个:

    start: function(e, ui){
        $(this).find('.tinyMCE').each(function(){
            tinyMCE.execCommand( 'mceRemoveControl', false, $(this).attr('id') );
        });
    },
    stop: function(e,ui) {
        $(this).find('.tinyMCE').each(function(){
            tinyMCE.execCommand( 'mceAddControl', true, $(this).attr('id') );
            $(this).sortable("refresh");
        });
    }
    

    在我的例子中,我将所有 MCE 实例归类为 .tinyMCE

    【讨论】:

    • +1 帮了我很多忙!它还有助于理解它试图做的是删除 textarea 上的 tinyMCE 并移动其中包含内容的裸文本区域,一旦放置完成,它会再次重新应用 tinyMCE。这应该不仅对 jQuery 可排序脚本有用,而且对任何 DOM 操作脚本都有帮助。
    • 效果很好!请注意,在 TinyMCE 4 中,命令已更改为 mceAddEditor 和 mceRemoveEditor
    • 这对我有帮助,谢谢!但是为什么将$(this).sortable("refresh"); 放在停止例程中呢?是否有一个原因?我还注意到它在每个 tinymce 元素上都被调用,所以看起来是多余的......
    • 在拖动发生时,没有其他人会担心这会导致 textarea 及其原始 HTML 内容变得可见吗?我的意思是这行得通,但它很难看。
    • @AlienBishop 在 Sortable.js 中,它通过删除和添加 onEnd(一个接一个)来工作,这意味着布局在拖动时显示,然后在放置后读取。
    【解决方案2】:

    对于 TinyMCE 的第 4 版

    start: function (e, ui) {
      $(ui.item).find('textarea').each(function () {
         tinymce.execCommand('mceRemoveEditor', false, $(this).attr('id'));
      });
    },
    stop: function (e, ui) {
      $(ui.item).find('textarea').each(function () {
         tinymce.execCommand('mceAddEditor', true, $(this).attr('id'));
      });
    }
    

    【讨论】:

      【解决方案3】:

      嗯,对于 TinyMce v.4+,这个问题的稳定解决方案是:

      start: function(e, ui){
              tinyMCE.triggerSave();
          },
          stop: function(e,ui) {
      
              $(this).find('textarea').each(function(){
                  tinyMCE.execCommand( 'mceRemoveEditor', false, $(this).attr('id') );
      
                  // if your tinymce instance have different settings
                  tinymce.init(tinymce_settings($(this).attr('data-type')));
      
                  tinyMCE.execCommand( 'mceAddEditor', false, $(this).attr('id') );
              });
          }
      

      如果您的 textarea 应用了不止一种类型的设置,您必须在每次重置之前声明tinymce.init(settings),否则最后应用的设置将应用于所有设置。

      改变设置的一种简单方法是在您的文本区域上设置设置类型的标志,例如:

      <textarea data-type="settings_one"></textarea> <textarea data-type="settings_two"></textarea>

      然后使用一个加载器函数来分发必要的函数:

      function tinymce_settings(type) {
      
      var settings;
      
      switch(type) {
      
        case 'settings_one' :
          settings = {...}
          break;
        }    
       return settings;
      }
      

      【讨论】:

        【解决方案4】:

        对于任何试图动态分配“textarea1”的人,可拖动对象作为 ui.item 在 ui 对象中。对于每个可排序的一个文本区域:

        tinyMCE.execCommand( 'mceAddControl', false,  $('textarea',ui.item)[0].id );
        
        tinyMCE.execCommand( 'mceRemoveControl', false,  $('textarea',ui.item)[0].id );
        

        【讨论】:

        • 您的代码 $('textarea',ui.item)[0].id 运行良好。
        【解决方案5】:

        不,没有其他解决方案。这是它需要做的方式。 当操作包含 tinymce 实例的 dom 元素时,您需要停用它们并在使用 mceRemoveControlmceAddControl 完成 dom 操作后重新激活它们。

        【讨论】:

          【解决方案6】:

          我最终只是在可排序的 stop() 事件上销毁并重新创建编辑:

          stop: function (e, ui) {
            $(this).find('textarea').each(function () {
              tinyMCE.get($(this).attr('id')).destroy();
              // the code below locates and evals the editor init script
              eval($(this).parents('.item').find('script').html());
            });
          }
          

          像魅力一样工作,可能比其他建议在 start() 事件上销毁编辑器然后在 stop() 上重新创建更好的选择 - 因为这样你仍然在拖动具有视觉吸引力的编辑器。附:使用 TinyMCE 4.5.2

          【讨论】:

            【解决方案7】:

            我有一个包含多个段落的动态表单,都可以使用 TinyMCE 进行编辑。为了允许对段落重新排序,我添加了上下移动文本区域的按钮。

            我设法在向上或向下移动 textarea 的按钮上使用 alt="textareaid" 使其工作,并将此 textareaid 用于 mceRemoveEditor 和 mceAddEditor 命令。 textarea 必须位于 class="textarea_container" 的 div 中。

            $('.move_textarea_up').click(function(){
                var tinymceid= $(this).attr("alt");
                tinyMCE.execCommand('mceRemoveEditor', false, tinymceid);
                $(this).closest('div.textarea_container').insertBefore($(this).closest('div.textarea_container').prev());
                tinyMCE.execCommand('mceAddEditor', false, tinymceid);
            }); 
            $('.move_textarea_down').click(function(){
                var tinymceid= $(this).attr("alt");
                tinyMCE.execCommand('mceRemoveEditor', false, tinymceid);
                $(this).closest('div.textarea_container').insertAfter($(this).closest('div.textarea_container').next());
                tinyMCE.execCommand('mceAddEditor', false, tinymceid);
            });
            

            【讨论】:

              【解决方案8】:

              对我来说有效的解决方案就在这里。 对于 TinyMCE 的第 4 版

              我的案例:我正在使用带有中继器字段的可排序 jquery 用于元框 在wordpress里面。每个可排序元素都将 textarea 转换为 tinyMCE 编辑器。

              当我从可排序的项目中移动一个元素时,里面的编辑器只有一个元素被破坏并且没有内容显示在视觉中 标签。 我使用 mceRemoveEditormceAddEditor 来防止出现问题。

              所以我在结合了上述一些解决方案后得出了这个最终解决方案。感谢@Honorable Chow ,@pragmar @Sonicdesign 好吧,你的解决方案并没有像现在这样对我有用,所以我修改了它们。这是我的代码,对我来说很好用。

              start: function(e, ui){
                      tinyMCE.execCommand( 'mceRemoveEditor', false,  jQuery('textarea',ui.item)[0].id );
                  },
                  stop: function(e,ui) {
                      tinyMCE.execCommand( 'mceAddEditor', false,  jQuery('textarea',ui.item)[0].id );
                  }
              

              【讨论】:

              • 任何想法如何使它与不同的两种不同的 TinyMCE 配置一起工作?它似乎只应用了排序的最后一个配置。
              【解决方案9】:

              我已经能够解决类似的问题:

              tinymce.activeEditor.setMode('readonly');

              tinymce.activeEditor.setMode('design');

              这适用于版本 4.3.x

              【讨论】:

                【解决方案10】:

                我已经完成了

                $("#stores-container").sortable({
                
                        stop: function(event, ui) {
                
                            textareaID = $(ui.item).find(' textarea').attr('id');
                
                            textareaVal=$(ui.item).find(' textarea').val();
                
                            editorID=$(ui.item).find('.mce-container').attr('id');
                
                            $( "#"+editorID ).remove();
                
                            $('#'+textareaID).show();
                            tinymce.init({selector: '#'+textareaID});
                        }
                
                    });
                

                【讨论】:

                  【解决方案11】:
                  start: function (e, ui) {
                    tinyMCE.execCommand( 'mceRemoveEditor', false, editor_id );
                  },
                  stop: function (e, ui) {
                    tinymce.execCommand('mceAddEditor', true, editor_id);
                  }
                  

                  这很好用,只是我用于一个编辑器。非常感谢:)。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-12-12
                    • 2011-05-18
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-01-08
                    • 2016-03-18
                    相关资源
                    最近更新 更多