Ckeditor 在没有用户交互的情况下设置默认段落样式

Ckeditor 在没有用户交互的情况下设置默认段落样式,ckeditor,Ckeditor,我试图设置默认的样式,当用户进入空白编辑区域时,将自动应用到元素> /代码>中。我花了很多时间寻找答案,但没有找到任何有效的答案。这些要求是: 样式必须是内联的,没有样式表 没有用户交互,没有可点击的格式/样式插件 当用户单击编辑区域并开始键入时,我希望样式自动应用并可见。肯定有办法做到这一点吗 我得到的最接近的方法是使用htmlFilter,如下所示: p_rule = { elements : { p : function(element) {

我试图设置默认的样式,当用户进入空白编辑区域时,将自动应用到<代码>元素> /代码>中。我花了很多时间寻找答案,但没有找到任何有效的答案。这些要求是:

  • 样式必须是内联的,没有样式表
  • 没有用户交互,没有可点击的格式/样式插件
当用户单击编辑区域并开始键入时,我希望样式自动应用并可见。肯定有办法做到这一点吗

我得到的最接近的方法是使用
htmlFilter
,如下所示:

p_rule = {
    elements : {
        p : function(element) {
            if (element.attributes.style === undefined) {
                element.attributes.style = "color: #0000ff;";
            }
        }
    }
};
ev.editor.dataProcessor.htmlFilter.addRules(p_rule);
但新样式不会自动显示

如果用户进入源代码编辑模式并返回到
WYSIWYG
,它确实会变得可见,但我希望它是自动的

我尝试在filter函数中使用
updateElement()
,但它不起作用,并创建无限递归:

p_rule = {
    elements : {
        p : function(element) {
            if (element.attributes.style === undefined) {
                element.attributes.style = "color: #0000ff;";
                CKEDITOR.instances['editor1'].updateElement();
            }
        }
    }
};
ev.editor.dataProcessor.htmlFilter.addRules(p_rule);
(我猜
updateElement()
会触发过滤器)

如果我从事件中使用
setData(getData())
,我会奇怪地使
textarea
随着过滤器应用的更改而更新,例如:

CKEDITOR.instances['editor1'].on('blur', function() {
    CKEDITOR.instances['editor1'].setData(CKEDITOR.instances['editor1'].getData());
});
但这也需要用户交互。使用“change”事件创建递归

我是CKEditor的新手,很明显,我缺少了一些关于过滤器如何工作的信息,这些信息与文本区域中当前显示的内容相关

有没有
CKEditor
guru?救命啊


谢谢

我真的建议不要走这条路。你会发现自己在与无数的问题作斗争,比如如果你复制和粘贴,如果你将格式更改为h1然后再返回,如果你创建一个列表项然后将其转换为一个段落,等等。实际上有几十个这样的问题。你需要重写一半的编辑器

在CKEditor 4中处理此问题的方法是重新思考:

样式必须是内联的,没有样式表

在CKEditor中,您显然需要使用样式表。我想您希望输出中包含内联样式。因此,我建议:

  • 编写htmlFilter规则,将此样式添加到每个段落中
  • 编写从每个段落中删除此样式的数据筛选规则
  • 第二条规则是必需的,因此如果保存数据,然后将其加载回编辑器,则样式不会污染数据

    PS.将数据模型从渲染(视图)中分离出来,这样您就可以按照自己的意愿渲染段落,而不会影响其他功能与段落的交互方式。阅读中有关CKEditor 5的更多信息