简体   繁体   English

在一页中使用自定义按钮实现多个TinyMCE编辑器

[英]Implementing multiple TinyMCE editor with custom button in one page

I'm trying to create a JS library, which modify all textarea tags with data-tiny="TinyMCE" attribute to TinyMCE editors. 我正在尝试创建一个JS库,该库将data-tiny =“ TinyMCE”属性的所有textarea标记修改为TinyMCE编辑器。 The number of textarea tags is not predictable. textarea标签的数量是不可预测的。

Custom Buttons will be added to all Editors, and everything is going fine in the execution, except one thing. 自定义按钮将被添加到所有编辑器中,并且除一件事外,一切都在执行中正常进行。

THE PROBLEM: 问题:

The custom buttons click event, add the content to the last Editor regardless the button of which editor is clicked. 自定义按钮单击事件,无论单击哪个编辑的按钮,都将内容添加到最后一个编辑器。

I've attached the jsFiddle here, and the problem has been commented on lines 37 and 38 of js 我在这里附加了jsFiddle ,并且该问题已在js的第37和38行中进行了评论

here is the code : 这是代码:

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);
}

Any help would be appreciated. 任何帮助,将不胜感激。

TinyMCE keeps an array of all instances of TinyMCE on on the page. TinyMCE在页面上保留所有TinyMCE实例的数组。 Try something like this: 尝试这样的事情:

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

The array (from my testing) adds editors to the array in the order you init them in the page so the "last" editor initialized should always be the one that answers to: 数组(根据我的测试)按照您在页面中对其进行初始化的顺序将编辑器添加到数组中,因此初始化的“最后一个”编辑器应始终是能够满足以下要求的编辑器:

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

See this modified JS Fiddle: https://jsfiddle.net/j1fmLc40/ 看到这个修改过的JS小提琴: https : //jsfiddle.net/j1fmLc40/

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM