带有 getUIKIT 英国手风琴的 tinyMCE 5 (hide/show div)

tinyMCE 5 with getUIKIT uk-accordion (hide/show div)

我使用的是 tinyMCE 5 和 getUIKIT 3。我将编辑器放在 uk-accordion 中,这样我就可以 show/hide div。第一次显示 div 时一切顺利,编辑器功能齐全。我隐藏 div,再次显示 - 编辑器有时不在。从此以后,我hide/show的时候,它再也不在了。 这是一个有问题的代码笔:https://codepen.io/prtome/pen/gJLdKo?editors=1111

和我的代码(非常简单): HTML

<ul uk-accordion>
  <li  id="toto">
    <a class="uk-text-primary uk-accordion-title" href="#">Item toto</a>
    <div class="uk-accordion-content">
        <textarea id="basic-example"></textarea>

     </div>
   </li>
 </ul>

和 JS 代码:

UIkit.util.on('#toto', 'shown', function (event) {
 tinymce.EditorManager.execCommand('mceAddEditor',false, 'basic-example');
  $('#basic-example').html("<p style=\"text-align: center;\"> blabla bla bla bla bla I can edit this </p>");
  tinymce.init({
  selector: 'textarea#basic-example',
  height: 200,
  menubar: true,
  plugins: [
    'advlist autolink lists link image charmap print preview anchor ',
    'searchreplace visualblocks code fullscreen',
    'insertdatetime media table paste code help wordcount'
  ],
  toolbar: 'undo redo | formatselect | bold italic backcolor | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | removeformat | help',
  content_css: [
    '//fonts.googleapis.com/css?family=Lato:300,300i,400,400i',
    '//www.tiny.cloud/css/codepen.min.css'
  ]
 });
});

UIkit.util.on('#toto', 'hidden', function (event) {
 tinymce.execCommand('mceRemoveEditor', false, "basic-example");      
})

我在控制台中没有错误。我找不到我做错了什么 - 但很明显有些东西没有正常工作。如果有人能指出问题出在哪里,那将非常有帮助。 谢谢

问题似乎确实是 uk-accordion 和 tinyMCE 之间的一些不兼容问题。由于我真的不想多次初始化编辑器,所以我认为最好的解决方案是将文本区域放在手风琴之外。在我的实际情况下,我将编辑器作为最后一个手风琴,所以这不是问题。 所以我的 HTML 现在是:

<ul uk-accordion>
    <li id="toto" class="uk-open">
        <a class="uk-text-primary uk-accordion-title" href="#">Item toto</a>
        <div class="uk-accordion-content" >
          <p>blablabla</p>
        </div>  
    </li>
</ul>
<textarea id="basic-example" class="uk-hidden"></textarea>

和 JS

 $('#basic-example').html("<p style=\"text-align: center;\"> blabla bla bla bla bla I can edit this </p>");

  tinymce.init({
  selector: 'textarea#basic-example',
  height: 200,
  menubar: true,
  plugins: [
    'advlist autolink lists link image charmap print preview anchor ',
    'searchreplace visualblocks code fullscreen',
    'insertdatetime media table paste code help wordcount'
  ],
  toolbar: 'undo redo | formatselect | bold italic backcolor | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | removeformat | help',
  content_css: [
    '//fonts.googleapis.com/css?family=Lato:300,300i,400,400i',
    '//www.tiny.cloud/css/codepen.min.css'
  ],
    setup: function(ed) {
        ed.on('init', function(e) {
            e.target.hide();
        });
    }
});
UIkit.util.on('#toto', 'shown', function (event) {
  $('#basic-example').removeClass("uk-hidden");
  tinymce.editors['basic-example'].show();
})
UIkit.util.on('#toto', 'hidden', function (event) {
tinymce.editors['basic-example'].hide();
  $('#basic-example').addClass("uk-hidden");
})

完美运行,这就是codepen https://codepen.io/prtome/pen/VObZaK

这可能是由于 UIKIT 处理显示和隐藏内容的方式所致。如果它在不可见时使用 display:none 到 "hide" 元素,并在显示项目时更改可见性 - 这将导致 TinyMCE 出现问题,因为当元素具有 display:none 时,它不再DOM 的一部分。当您稍后显示手风琴的内容时,display:none 更改为 display:block 并且元素现在是 DOM 的一部分。实际上,每次你 show/hide 你可能会创建和销毁 DOM 个元素。

你需要做的不是 init() TinyMCE,直到 <textarea> 通过 "shows" 适当的 <textarea> 的操作显示。当您隐藏该手风琴时,您需要使用 remove() API 断开 TinyMCE 之前 手风琴关闭发生(例如在 <li> 恢复为 display:none 并且元素从 DOM 中删除之前。

我不知道你是否可以强制 UIKIT 使用 visibility:hidden 而不是 display:none,但如果可能的话,这将消除所有这些。