CKEditor内联在模态引导程序窗口中

时间:2014-09-03 08:42:27

标签: jquery html5 twitter-bootstrap ckeditor

我需要在模态引导程序中使用CKEditor内联,但它不起作用...

我已阅读此帖:How to use CKEditor in a Bootstrap Modal?

但它与我不同,因为我正在使用内联,我只需要将CKEditor应用于某些字段(我还有其他使用contenteditable属性)。

JS CODE:

CKEDITOR.disableAutoInline = true;
CKEDITOR.inline('myModalLabel');
CKEDITOR.inline('bodyModal');

$.fn.modal.Constructor.prototype.enforceFocus = function () {
    modal_this = this
    $(document).on('focusin.modal', function (e) {
        if (modal_this.$element[0] !== e.target && !modal_this.$element.has(e.target).length
        // add whatever conditions you need here:
        &&
        !$(e.target.parentNode).hasClass('cke_dialog_ui_input_select') && !$(e.target.parentNode).hasClass('cke_dialog_ui_input_text')) {
            modal_this.$element.focus()
        }
    })
};

HTML CODE

<button type="button" data-toggle="modal" data-target="#modalAddBrand">Launch modal</button>

<div class="modal fade" id="modalAddBrand" tabindex="-1" role="dialog" aria-labelledby="modalAddBrandLabel" aria-hidden="true">
    <div class="modal-dialog modal-lg">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
                 <h4 class="modal-title" id="modalAddBrandLabel">add</h4>

            </div>
            <div class="modal-body">
                <form>
                    <textarea name="editor1" id="editor1" rows="10" cols="80">This is my textarea to be replaced with CKEditor.</textarea>
                </form>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                <button id="AddBrandButton" type="button" class="btn btn-primary">Save</button>
            </div>
        </div>
    </div>
</div>

的jsfiddle:

JSFiddle Example

有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:4)

问题是,当你初始化CKEDITOR实例时,那个时间目标是隐藏的,所以如果你在目标显示后实例化编辑器就会出现:

所以你简单地说:

CKEDITOR.disableAutoInline = true;

$('#myModal').on('shown.bs.modal', function () {
   CKEDITOR.inline('myModalLabel');
   CKEDITOR.inline('bodyModal');
});

但在关闭并重新打开模态后,您可能会收到错误:

  

Uncaught编辑器实例&#34; myModalLabel&#34;已附加到提供的元素

<强>更新

为此我们可以有功能:

function ckCreate(name)
{
    if(CKEDITOR.instances[name] === undefined) 
    {
        CKEDITOR.inline(name);
    }
}

仅在不存在的情况下创建实例;

最后你的代码是:

CKEDITOR.disableAutoInline = true;

$('#myModal').on('shown.bs.modal', function () {
   ckCreate('myModalLabel');
   ckCreate('bodyModal');
});

最后的小提琴:http://jsfiddle.net/0vLs3fku/4/

更新:需要销毁实例

function ckCreate(name)
{
    if (CKEDITOR.instances[name]) 
    {
        CKEDITOR.instances[name].destroy();
    }

    CKEDITOR.inline(name);
}

答案 1 :(得分:3)

似乎是影响webkit / blink浏览器的已知错误。原因是当一个元素被隐藏时,属性contenteditable被删除,在这种情况下,必须销毁CKEDITOR实例并重新创建contenteditable属性必须设置为true。

因此,当使用shown.bs.modal事件显示对话框时,您可以再次设置属性。

您必须获取已打开对话框的所有ex contenteditable元素。

代码:

$('#myModal').on('shown.bs.modal', function (e) {
    $(this).find("*[contenteditable='false']").each(function () {
        var name;
        for (name in CKEDITOR.instances) {
            var instance = CKEDITOR.instances[name];
            if (this && this == instance.element.$) {
                instance.destroy(true);
            }
        }
        $(this).attr('contenteditable', true);
        CKEDITOR.inline(this);
    })
});

演示:http://jsfiddle.net/IrvinDominin/q5zxn3yf/

答案 2 :(得分:1)

好吧,毕竟,我做了两个答案的混合......现在它正在工作......你怎么看?

$(document).ready(function(e) {
    CKEDITOR.disableAutoInline = true;
    CKEDITOR.inline('myModalLabel');
    CKEDITOR.inline('bodyModal');


    $('#myModal').on('shown.bs.modal', function () {
        ckCreate('myModalLabel');
        ckCreate('bodyModal');
    });
});

function ckCreate(name) {
    if (CKEDITOR.instances[name]) {

        var instance = CKEDITOR.instances[name];
        if (instance.element.$) {
            instance.destroy(true);
        }

        $('#' + name).attr('contenteditable', true);
        CKEDITOR.inline(name);

    }

}