javascript - 无法重复使用弹出嵌入的 TinyMCE 编辑器

标签 javascript jquery html tinymce fancybox

我正在为嵌入 Fancybox 弹出窗口中的流行 TinyMCE 编辑器插件的问题而烦恼。

我显示可编辑的对象列表以及编辑链接。

按下“编辑”链接时,AJAX 调用会从服务器检索内容,并将其放入 <textarea> 中。 。 TinyMCE 编辑器在此 <textarea> 上动态启动。 。

当该弹出窗口关闭时,它会触发清理功能。

第一次触发此事件时,它可以正常工作。

所有其他尝试都会失败。必须重新加载页面,TinyMCE 才能按预期再次工作。

结果是TinyMCE编辑器隐藏在页面上,textarea对象隐藏在页面上。即使我要覆盖 FireBug 中的可见性/显示属性,编辑器仍然无法工作。 (意思是:编辑器中没有显示任何内容,没有显示克拉/光标,根本无法修改内容;我可以使用工具栏按钮,但它们也不影响可见内容)。

我正在使用 TinyMCE 4.2.4 进行 jQuery。

这是我的 TinyMCE 编辑器初始化/清理代码:

hideEditor = function(){
    tinyMCE.remove('#r_description');
};
loadEditor = function(){
    tinyMCE.init({
        script_url : '/js/plugins/tinymce/tinymce.min.js',
        selector: "#r_description",
        mode: "none",
        setup :  function(ed) {
            var tinymce_placeholder = $('#'+ed.id);
            var attr = tinymce_placeholder.attr('placeholder');

            if (typeof attr !== 'undefined' && attr !== false) {
                var is_default = false;

                ed.on('init' , function(ed) {
                    var cont = ed.target.getContent().replace(/<p>|<\/p>/g, '');
                    if(cont.length == 0){
                        ed.target.setContent(tinymce_placeholder.attr("placeholder"));
                        cont = tinymce_placeholder.attr("placeholder");
                    }

                    is_default = (cont == tinymce_placeholder.attr("placeholder"));
                    if (!is_default){ return; }
                });

                ed.on('focus', function(ed,e) {
                    var cont = ed.target.getContent().replace(/<p>|<\/p>/g, '');
                    is_default = (cont == tinymce_placeholder.attr("placeholder"));
                    if (is_default){
                        ed.target.setContent('');
                    }
                });

                ed.on('blur', function(ed,e) {
                    var cont = ed.target.getContent();
                    if ( cont == '' ){
                        ed.target.setContent( tinymce_placeholder.attr("placeholder") );
                    }
                });

            }
        },

        // General options
        theme : "modern",
        theme_advanced_toolbar_location : "top",
        theme_advanced_toolbar_align : "left",
        theme_advanced_resizing : true,
        toolbar: "link unlink | undo redo",
        relative_urls : false,
        remove_script_host : false,
        content_css: "/css/wysiwyg.css",
        menubar: false,
        statusbar: false
    });
}

这是相关的“编辑”链接代码:

$("a.edit").on( "click", function(){
    var id = $(this).data("id");
    if (id != "" ){
        $.get( '/load-' + $ttype + '?d=' + id , function( d ){
            if ( d == 0 ){
            } else {

                $(".edited").find("#r_description").val( d.description );                   
                $.fancybox( "#addResource", {
                    afterLoad: function () { 
                        loadEditor();
                    },
                    beforeClose: function () { hideEditor(); }
                });
            }
        });

    }
    return false;
});

最佳答案

我试图解决你的问题。如果我理解正确的话,你有链接列表,每个链接都应该用 TinyMCE 编辑器打开一个 fancybox。

我在this JSFIDDLE完成了它例子。但只需一个技巧:

HTML

<a href='javascript:void(0);' class="editor" data-descr='test1'>editor 1</div> <br/>
<a href='javascript:void(0);' class="editor" data-descr='test2'>editor 2</div> <br/>
<a href='javascript:void(0);' class="editor" data-descr='test3'>editor 3</div> <br/>

<div id="TheFancybox" style="display: none;">  
    <textarea id="r_description"></textarea>
</div>

JS

$("a.editor").on( "click", function(){
var self = $(this);                   
   $.fancybox( "#TheFancybox", {
       afterLoad: function () { 
           /* loadEditor();
            tinyMCE.get("r_description").execCommand('mceInsertContent', false, self.data('descr')); */
            //tinyMCE initialized here not working correctly   
        },
        afterClose: function () { hideEditor(); }
    });
    //but if you init it here - it will

    $('#r_description').val(self.data('descr')); 
    loadEditor();

    return false;
});

function hideEditor(){
    tinyMCE.remove('#r_description');
};

function loadEditor(){
    tinymce.init({
        selector: "#r_description",
        mode: "none",
        setup :  function(ed) {
            var tinymce_placeholder = $('#'+ed.id);
            var attr = tinymce_placeholder.attr('placeholder');

            if (typeof attr !== 'undefined' && attr !== false) {
                var is_default = false;

                ed.on('init' , function(ed) {
                    var cont = ed.target.getContent().replace(/<p>|<\/p>/g, '');
                    if(cont.length == 0){
                        ed.target.setContent(tinymce_placeholder.attr("placeholder"));
                        cont = tinymce_placeholder.attr("placeholder");
                    }

                    is_default = (cont == tinymce_placeholder.attr("placeholder"));
                    if (!is_default){ return; }
                });

                ed.on('focus', function(ed,e) {
                    var cont = ed.target.getContent().replace(/<p>|<\/p>/g, '');
                    is_default = (cont == tinymce_placeholder.attr("placeholder"));
                    if (is_default){
                        ed.target.setContent('');
                    }
                });

                ed.on('blur', function(ed,e) {
                    var cont = ed.target.getContent();
                    if ( cont == '' ){
                        ed.target.setContent( tinymce_placeholder.attr("placeholder") );
                    }
                });
            }
        },

        // General options
        theme : "modern",
        theme_advanced_toolbar_location : "top",
        theme_advanced_toolbar_align : "left",
        theme_advanced_resizing : true,
        toolbar: "link unlink | undo redo",
        relative_urls : false,
        remove_script_host : false,
        content_css: "/css/wysiwyg.css",
        menubar: false,
        statusbar: false
    });
}

希望能帮助您解决问题。

关于javascript - 无法重复使用弹出嵌入的 TinyMCE 编辑器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32149619/

相关文章:

javascript - 无法使用 JavaScript 验证 Bootstrap Modal 中的表单

jquery - 视差滚动更平滑

HTML:跨越时统一单元格大小

javascript - 限制事件监听器每秒可以触发的次数

javascript - 服务器标记对于 ItemTemplate 的 ASP DropDownList 格式不正确

jquery - bootstrap carousel 通过点击图片 Items 添加高亮样式

javascript - 无法在 JavaScript 中显示来自 Base64 字符串的图像

jquery - 如何在时钟界面上获取用户输入

javascript - 如何仅在reactjs中向单击的元素添加类?

javascript - 使用 FileReader 加载 CSV 以制作 map 标记的 JS 对象( map API)