Html 如何强制CKEditor保存<;br>;标签
我在标准包中使用了最新版本的CKEditor(到目前为止为4.7),我希望能够强制它保留换行元素(Html 如何强制CKEditor保存<;br>;标签,html,ckeditor,Html,Ckeditor,我在标准包中使用了最新版本的CKEditor(到目前为止为4.7),我希望能够强制它保留换行元素() 我尝试使用以下配置,但未成功: CKEDITOR.replace('ck', { allowedContent: true, enterMode: CKEDITOR.ENTER_BR }); 正如您所看到的,在开源模式下,标记已被替换为 如何实现这一点?据报道,CKeditor的开发人员告诉我们,br到nbsp自动转换不是一个问题,而是CKeditor规范化事物的方法 它不会给
)
我尝试使用以下配置,但未成功:
CKEDITOR.replace('ck', {
allowedContent: true,
enterMode: CKEDITOR.ENTER_BR
});
正如您所看到的,在开源模式下,
标记已被替换为
如何实现这一点?据报道,CKeditor的开发人员告诉我们,br到nbsp自动转换不是一个问题,而是CKeditor规范化事物的方法 它不会给你带来任何问题。因此,您不必担心您的br标记被转换为nbsp 再看一遍 如果您希望从源代码中删除,其中一种方法是包括以下内容:
basicEntities: false,
entities_additional: 'lt,gt,amp,apos,quot'
对此给出了一个解决方案(或至少部分解决方案),强制CKEditor保留
标记:
editor.on( 'pluginsLoaded', function( evt ){
evt.editor.dataProcessor.dataFilter.addRules({
elements :{
br : function( element ) {
//if next element is BR or <!--cke_br_comment-->, ignore it.
if( element && element.next && ( element.next.name == 'br' || element.next.value == 'cke_br_comment' ) ){
return;
}else {
var comment = new CKEDITOR.htmlParser.comment( 'cke_br_comment' );
comment.insertAfter( element );
}
}
}
});
evt.editor.dataProcessor.htmlFilter.addRules({
comment : function( value, node ) {
if( value.indexOf('cke_br_comment') >= 0 ) {
return false;
}
}
});
editor.on('pluginsload',函数(evt){
evt.editor.dataProcessor.dataFilter.addRules({
要素:{
br:函数(元素){
//如果下一个元素是BR或,则忽略它。
if(element&&element.next&&element.next.name='br'| | element.next.value==''cke_br_comment')){
返回;
}否则{
var comment=new CKEDITOR.htmlParser.comment('cke_br_comment');
注释。插入者(要素);
}
}
}
});
evt.editor.dataProcessor.htmlFilter.addRules({
注释:函数(值、节点){
if(value.indexOf('cke\u br\u comment')>=0){
返回false;
}
}
});
编辑:您可能还想查看my,根据您的需要,这可能会更好。我想我找到了一个更好的答案,它适用于更多情况:引入“brangel”插件: 其思想是在CKEditor的过滤阶段(请参阅和事件)发生之前,通过临时将
元素替换为一些占位符文本({cke_br}
)来保存
元素,以防止其被破坏,然后在最后将它们还原回来。这对用户来说是完全透明的
.您提供的小提琴将不使用任何内容替换
div
之外存在的任何中断标记。这将显示那些标记被替换为
的外观。如果清除编辑器,请添加相同的文本,然后单击“源”,它将显示
标记被保留。为了保留
标记,它们必须是
的子标记。您的应用程序是否可以反映这一点?不幸的是,我无法控制哪些内容加载到我的CKEditor中。内容由我的客户端发送,然后加载到CKEditor中,而他是预期的我想这会对你有帮助:@mohammedyasinsinechabli我已经在使用这个配置了。br
标记被使用了,这不是问题。问题是CKEditor删除了一些br
标记,并用
替换它们。你是在简单的html或模板引擎中使用CKEditor吗?我知道这不是一个问题,因为输出看起来是一样的。但是,如果你认为消息可以从第三方工具中解析出来,这可能成为一个问题。考虑一下你的答案与你给我的一个尝试中的解决方案更新一下。提示:似乎很好。参见更新小提琴。:.如果你想得到赏金,请随时更新你的答案。如果你想避免这个问题本身,你可以简单地使用基本分位数:FalseCentities,不管它是一个空格还是一个空格。我想要的是保留BR。没关系,我会根据你给我的罚单中给出的解决方法来回答
CKEDITOR.plugins.add('brangel', {
init: function (editor) {
editor.on('toHtml', function( evt ) {
protectBRs(evt.data.dataValue);
}, null, null, 5);
editor.on('toHtml', function( evt ) {
unprotectBRs(evt.data.dataValue);
}, null, null, 14);
editor.on('toDataFormat', function( evt ) {
protectBRs(evt.data.dataValue);
}, null, null, 5);
editor.on('toDataFormat', function( evt ) {
unprotectBRs(evt.data.dataValue);
}, null, null, 14);
function protectBRs(element) {
var children = element.children;
if (children) {
for (var i = children.length; i--; ) {
var child = children[i];
if (child.name == "br") {
var placeholder = new CKEDITOR.htmlParser.text('{cke_br}');
placeholder.insertAfter(child);
child.remove();
} else {
protectBRs(child);
}
}
}
}
function unprotectBRs(element) {
var children = element.children;
if (children) {
for (var i = children.length; i--; ) {
var child = children[i];
if (child instanceof CKEDITOR.htmlParser.text && child.value === "{cke_br}") {
var br = new CKEDITOR.htmlParser.element('br');
br.insertAfter(child);
child.remove();
} else {
unprotectBRs(child);
}
}
}
}
}
});