我需要在模态引导程序中使用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">×</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:
有人可以帮帮我吗?
答案 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);
})
});
答案 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);
}
}