此代码必须将文本从textarea text
复制到textarea text_hidden
,此代码无需ckeditor
onKeyUp="document.getElementById('text_hidden').value = this.value;
但启用了ckeditor
onKeyUp="document.getElementById('text_hidden').value = this.value;
不起作用。
如何解决这个问题?
<textarea name="text" id="text" rows="6" cols="80" onKeyUp="document.getElementById('text_hidden').value = this.value;" ></textarea></p>
<textarea name="text_hidden" id="text_hidden" rows="6" cols="80" ></textarea>
<script>
CKEDITOR.replace( 'text' ,
{
allowedContent: true,
enterMode: CKEDITOR.ENTER_BR,
});
CKFinder.SetupCKEditor( editor, '/ckfinder/' );
config.startupPath = "/files/";
</script>
答案 0 :(得分:2)
以下是我的CKEditor-textarea同步演示,反之亦然: https://jsfiddle.net/ty5ks393/1/ 。键入三个白色框中的一个,然后在所有四个容器中查看内容复制。
它使用Bootstrap来保持整洁,并显示经典和内联CKEditor。这里提取了相关部分(没有外部资源,注释和console.logs):
<div class="row">
<div class="col-sm-3">
<h2>TEXTAREA</h2>
<textarea id="textarea" class="box"></textarea>
</div>
<div class="col-sm-3">
<h2>CK EDITOR INLINE</h2>
<div contenteditable="true" id="contentedit" class="box"></div>
</div>
<div class="col-sm-3">
<h2>CK EDITOR</h2>
<textarea id="ckeditor" class="box"></textarea>
</div>
<div class="col-sm-3">
<h2>RESULT DIV</h2>
<div id="result" class="box"></div>
</div>
</div>
和jQuery:
$(function() {
CKEDITOR.disableAutoInline = true;
var ce = CKEDITOR.inline("contentedit", {
removePlugins: 'toolbar'
});
var ck = CKEDITOR.replace('ckeditor').on('change', function(e) {
if (document.activeElement.nodeName == "IFRAME") {
var thisHTML = e.editor.getData();
var tempDiv = $('<div>').html(thisHTML);
thisText = tempDiv.text();
$('#textarea').val(thisText);
$('#contentedit, #result').html(thisHTML);
}
});
var timer;
$('#textarea').keyup(function() {
var _this = this;
clearTimeout(timer);
timer = setTimeout(function() {
var thisText =$(_this).val().replace(/\n/g, "<br/>");
$('#result, #contentedit').html(thisText);
CKEDITOR.instances.ckeditor.setData(thisText);
}, 200);
});
$('#contentedit').keyup(function(e) {
var _this = this;
clearTimeout(timer);
timer = setTimeout(function() {
var thisHTML = $(_this).html();
var tempDiv = $('<div>').html(thisHTML.replace(/\<\/p\>/g,"</p>\n\n"));
thisText = tempDiv.text();
$('#textarea').val(thisText);
$('#result').html(thisHTML);
CKEDITOR.instances.ckeditor.setData(thisHTML);
}, 200);
});
});
所以我使用超时来避免使用setData()时keyup带来的瓶颈。我检测到我是否在IFRAME中,以确保当我使用setData()更改其他容器中的内容时,我不会将内容更改退回CKEditor。
我希望它对你们有些帮助。
答案 1 :(得分:1)
搜索后,我发现一篇文章(ckeditor-keyup-event)声明CKEditor api不支持“ keyup ”事件。 仅支持侦听按键事件的“ key ”方法。
文章作者在 editor.setData()的回调中使用 editor.document.on('keyup'),这只在初始化后可用。
我更喜欢在初始化期间附加所需的keyup事件,因为他的解决方法对我的用例不起作用。我改变了你的代码,如下所示,虽然它实际上没有附加到 keyup 事件,但对我来说效果很好。
CKEDITOR.replace( 'text' ,
{
allowedContent: true,
enterMode: CKEDITOR.ENTER_BR,
}).on('key',
function(e){
setTimeout(function(){
document.getElementById('text_hidden').value = e.editor.getData();
},10);
}
);
如果没有 setTimeout()函数, getData()将无法获取最后一次击键。
答案 2 :(得分:1)
如果您想将所见即所得内容与textarea同步,只需告知 on change 事件作为更新基础元素的选项。
CKEDITOR.replace('editor', {
on: {
change: function() {
this.updateElement();
}
}
});