【问题标题】:Implementing multiple TinyMCE editor with custom button in one page在一页中使用自定义按钮实现多个 TinyMCE 编辑器
【发布时间】:2016-11-04 15:12:40
【问题描述】:

我正在尝试创建一个 JS 库,它将所有带有 data-tiny="TinyMCE" 属性的 textarea 标记修改为 TinyMCE 编辑器。 textarea 标签的数量是不可预测的。

自定义按钮将添加到所有编辑器中,执行过程中一切正常,除了一件事。

问题:

自定义按钮点击事件,无论点击哪个编辑器的按钮,都将内容添加到最后一个编辑器

我这里附上了jsFiddle,问题已经在js的37、38行注释了

这里是代码:

var tinySelector = "textarea[data-tiny='TinyMCE']";
var tempGroupName;
var menuItems = [];
var tempGroups = ['Test Group'];
var temp = [{
  group: 'Test Group',
  css: '.test {color:red;}',
  title: 'Test Title',
  content: '<div class="test"> hi! </div>'
}];
var tinyContentCSS = "";

var tinys;
var direction = "ltr";

// Get all textarea elements which must be converted to a TinyMCE Editor
try {
  tinys = $("textarea[data-tiny='TinyMCE']").get();
} catch (e) {};

// This function creates a multilevel custom menu and adds it to the Editor
function createTempMenu(editor, editorIndex) {
  var k = 0;
  for (i = 0; i < tempGroups.length; i++) {
    var tempArray = [];
    tempArray[i] = [];
    tempGroupName = tempGroups[i];
    for (j = 0; j < temp.length; j++) {
      k++;
      if (temp[j].group == tempGroupName) {
        tempArray[i].push({
          editor: editor,
          text: temp[j].title,
          content: temp[j].content,
          css: temp[j].css,
          onclick: function() {
            this.settings.editor.insertContent(this.settings.content); // THE PROBLEM
            iframe_id = tinymce.editor.id + '_ifr'; // THE PROBLEM
            // adding styles to the head of the editor
            css_code = this.settings.css;
            with(document.getElementById(iframe_id).contentWindow) {
              var h = document.getElementsByTagName("head");
              if (!h.length) {
                if (DEBUG) console.log('length of h is null');
                return;
              }
              var newStyleSheet = document.createElement("style");
              newStyleSheet.type = "text/css";
              h[0].appendChild(newStyleSheet);
              try {
                if (typeof newStyleSheet.styleSheet !== "undefined") {
                  newStyleSheet.styleSheet.cssText = css_code;
                } else {
                  newStyleSheet.appendChild(document.createTextNode(css_code));
                  newStyleSheet.innerHTML = css_code;
                }
              } catch (err) {
                console.log(err.message);
              }
            }
          }
        });
      }
    }
    menuItems[i] = {
      text: tempGroupName,
      menu: tempArray[i]
    };
  }
  console.log(menuItems);
  return menuItems;
}

// This function gets an element and initialize it as a TinyMCE Editor
function initTinyDefault(strTinySelector, strTinyDir, editorIndex) {
  tinymce.init({
    language: 'en',
    selector: strTinySelector,
    theme: "modern",
    valid_elements: '*[*]',
    plugins: [
      "advlist autolink lists link image charmap print preview hr anchor pagebreak",
      "searchreplace wordcount visualblocks visualchars code fullscreen",
      "insertdatetime media nonbreaking save table contextmenu directionality",
      "emoticons template paste textcolor colorpicker textpattern"
    ],
    toolbar1: "insertfile undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image",
    toolbar2: "print preview media | forecolor backcolor emoticons | ltr rtl | UseTemplates",
    image_advtab: true,
    directionality: strTinyDir,
    paste_data_images: true,
    setup: function(editor) {
      editor.addButton('UseTemplates', {
        type: 'menubutton',
        text: 'Test Button',
        icon: false,
        menu: createTempMenu(editor, editorIndex)
      });
    },
    //content_css: tinyContentCSS,
  });
}


// Run the initialization function on the selected textarea elements one by one
for (i = 0; i < tinys.length; i++) {
  var str = $(tinys[i]).attr('data-tiny-id');
  $(tinySelector + "[data-tiny-id='" + str + "']").val(i);
  initTinyDefault(tinySelector + "[data-tiny-id='" + str + "']", direction, i);
}

任何帮助将不胜感激。

【问题讨论】:

    标签: javascript jquery html tinymce tinymce-4


    【解决方案1】:

    TinyMCE 在页面上保留所有 TinyMCE 实例的数组。试试这样的:

    tinymce.get(tinymce.editors.length-1).setContent();
    

    数组(来自我的测试)按照您在页面中初始化它们的顺序将编辑器添加到数组中,因此初始化的“最后一个”编辑器应该始终是响应的编辑器:

    tinymce.get(tinymce.editors.length-1)
    

    查看修改后的 JS Fiddle:https://jsfiddle.net/j1fmLc40/

    【讨论】:

    • 问题存在,如果点击第一个编辑器中的按钮,我想将内容添加到第一个编辑器,如果点击第二个编辑器上的按钮,我想将内容添加到第二个编辑器,并且...在你的小提琴中,就像我的一样,内容将被添加到最后一个,即使我点击第一个编辑器上的按钮
    • 我误解了你想要的 - 你希望文本在按钮所在的编辑器中 - 而不是最后一个编辑器。请参阅此更新的小提琴开始:jsfiddle.net/j1fmLc40/1您的问题是 JavaScript 中的范围,因为编辑器没有指向您认为的位置。我创建了一个简单的自定义菜单项,可以满足您的需要……您可以将其抽象为更复杂的内容。
    • 是的,我希望文本位于按钮所在的编辑器中 - 而不是最后一个编辑器。但仍然没有运气,在 jsfiddle 中它仍然插入到最后一个编辑器中,我认为按钮事件的最后一个定义取代了所有编辑器之前的定义。正如您定义的 self=editor,它与之前的代码相同。
    • 查看我添加到插入菜单中的菜单选项 - 它知道它所在的编辑器并适当地添加文本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多