创建TinyMCE内联编辑器并使其从按钮可见

时间:2014-12-12 06:56:22

标签: tinymce-4

我想在内联模式下使用TinyMCE 4.1.7。当用户右键单击DIV并选择编辑,表示他们想要编辑DIV时,我执行

var id= g.currentElement$.attr('id');
            tinymce.init({
                selector: "div#"+id,
                inline:true,
            });

这增加了一个TinyMCE编辑器(我知道因为我捕获了一个AddEditor事件),但它似乎没有将编辑器元素附加到DOM(我无法在Chrome DevTools Elements选项卡中看到它们)。要显示编辑器,我必须在DIV中单击。

我想更改此行为,以便当用户右键单击DIV并选择“编辑”时,我的处理程序也会通过单击DIV触发现在触发的任何内容。因此,在我启动编辑器之后,如上所述,我需要调用一些其他方法将编辑器附加到DOM并使其可见,因此单击上下文菜单中的编辑即可调出TinyMCE编辑器。

有人可以告诉我我需要做些什么来完成这项工作吗?

(我之所以无法点击DIV来启动编辑器,是因为点击已经意味着其他内容。单击即可选择DIV,可以删除,复制,轻推等等。拖动DIV会移动它。然后在DIV角上拖动会调整DIV的大小。右键单击“编辑”选项就是我剩下的。)

感谢您的帮助。

史蒂夫

3 个答案:

答案 0 :(得分:6)

我的工作原理如下。 我首先运行tinymce init:

var id= g.currentElement$.attr('id');
tinymce.init({
    selector: "div#"+id,
    inline:true,
});

这会为元素创建一个编辑器,但不会渲染或显示它。渲染和显示编辑器通常需要在元素上进行mousedown。

在逐步完成大量的代码后,我意识到在编辑器实例上触发focusin事件是编辑器渲染和显示的原因。所以我为AddEditor创建了一个回调。 AddEditor事件在编辑器创建过程的早期就出现了,我不想在编辑器完成之前激活焦点,所以在AddEditor事件中我得到了编辑器实例并为"创建了一个回调。 NodeChange,"这发生在编辑器创建的最后。

当NodeCreate进来时,我开始关注"关注"在编辑器上,按照我的意愿渲染和显示编辑器。现在,单击一下,运行tinymce init,并在元素顶部显示并准备好内联编辑器。

总代码为:

tinymce.on('AddEditor', function(e) {
    e.editor.on('NodeChange', function(e) {  // now that we know the editor set a callback at "NodeChange."
        e.target.fire("focusin");       // NodeChange is at the end of editor create. Fire focusin to render and show it
    });
});

如果有人发现任何错误,我会非常感谢任何评论。

由于

答案 1 :(得分:1)

tinymce.init({
    selector: "div#"+id,
    inline:true,
    setup: function (ed) {
       ed.on('init', function(e) {                        
          e.target.fire("focusin");
       });
    }
});

这将为启动编辑器实例提供诀窍。然后,最好对页面上的每个编辑器实例的每个NodeChange事件进行全局触发。 (假设有多个编辑器,但也可以使用单个编辑器。)

等待...

使用JS Promises有更好的做法。 tinymce.init返回一个Promise对象。

let tinyMcePromise= tinymce.init({
    selector: "div#"+id,
    inline:true
});

tinyMcePromise.then(function(editors){
    editors[0].focus();
});

官方文档:https://www.tinymce.com/docs/api/tinymce/root_tinymce/#init

当心:tinyMce的某些旧版本存在有关init Promise的错误。

答案 2 :(得分:0)

**Please first add jquery and tinymce library..**   

 <script src="latestjquery.js" type="text/javascript" charset="utf-8"></script>
    <script src="tinymce.min.js"></script>
    <form method="post">
        <textarea>here firstly onlciki will show menu and when edit will be selcted then it will be converted into ediotr</textarea>
      </form>
    <ul class='custom-menu'>
      <li data-action = "first">First thing</li>
      <li data-action = "second">Second thing</li>
      <li data-action = "third">Third thing</li>
    </ul>
    <script>
    //Trigger action when the contexmenu is about to be shown
    $("textarea").bind("contextmenu", function (event) {

        // Avoid the real one
        event.preventDefault();

        // Show contextmenu
        $(".custom-menu").finish().toggle(100).

        // In the right position (the mouse)
        css({
            top: event.pageY + "px",
            left: event.pageX + "px"
        });
    });


    // If the document is clicked somewhere
    $("textarea").bind("mousedown", function (e) {

        // If the clicked element is not the menu
        if (!$(e.target).parents(".custom-menu").length > 0) {

            // Hide it
            $(".custom-menu").hide(100);
        }
    });


    // If the menu element is clicked
    $(".custom-menu li").click(function(){
          tinymce.init({
            selector: "textarea"
         });
        // This is the triggered action name
        switch($(this).attr("data-action")) {

            // A case for each action. Your actions here
            case "first": alert("first"); break;
            case "second": alert("second"); break;
            case "editor": alert("editor will appear"); 

            break;
        }

        // Hide it AFTER the action was triggered
        $(".custom-menu").hide(100);
      });
    </script>   
    <style>
    .custom-menu {
        display: none;
        z-index: 1000;
        position: absolute;
        overflow: hidden;
        border: 1px solid #CCC;
        white-space: nowrap;
        font-family: sans-serif;
        background: #FFF;
        color: #333;
        border-radius: 5px;
    }

    .custom-menu li {
        padding: 8px 12px;
        cursor: pointer;
    }

    .custom-menu li:hover {
        background-color: #DEF;
    }
    </style>