在CKEditor 3.0中关闭包含<p>标签的功能

73
在CKEditor 3.x中,是否有可能关闭自动将所有书写内容封装在<p></p>中的功能?
我尝试过。
  CKEDITOR.config.enterMode = CKEDITOR.ENTER_BR;

但这只是将行内换行符改为<br />,而不改变所属段落。

目前输入"Test"会产生以下输出

<p>
    Test</p>

但我希望它更简单易懂

Test

有没有针对此功能的配置属性,或者是否有其他内联编辑器更适合此功能?


13个回答

101

CKEDITOR.config.enterMode = CKEDITOR.ENTER_BR; - 我觉得这个方法非常好用。

你试过清除浏览器缓存吗?有时这也会导致问题。
你也可以使用jQuery适配器来检查它:

<script type="text/javascript" src="/js/ckeditor/ckeditor.js"></script>
<script type="text/javascript" src="/js/ckeditor/adapters/jquery.js"></script>
<script type="text/javascript">
$(function() {
    $('#your_textarea').ckeditor({
        toolbar: 'Full',
        enterMode : CKEDITOR.ENTER_BR,
        shiftEnterMode: CKEDITOR.ENTER_P
    });
});
</script>


根据@Tomkay评论的更新:

自从CKEditor 3.6版本以来,您可以配置是否希望将内联内容自动包装在像<p></p>这样的标签中。以下是正确的设置:

CKEDITOR.config.autoParagraph = false;

Source: http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.config.html#.autoParagraph


11
我知道这已经被接受为正确答案,但我认为它实际上是不正确的。它确实防止内容被包装在段落标签中,但也会防止段落标签在应该生成时被生成,而插入换行符。一个正确的解决方案应该可以防止默认的<p></p>,同时在按下回车键时仍然将内容包装在段落中。 - Michael Hellein
1
对我来说它并不完美:在一个换行符后插入特殊字符在Firefox中会导致NS_ERROR_FAILURE错误。 - Damien
5
@MaksymilianMajer 你可以进行配置。请参见:http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.config.html#.autoParagraph - Tomkay
1
@Tomkay 在我回答的时候你可能还不能这样做。我会编辑它以反映新的配置选项。 - Maksymilian Majer
1
请注意:CKEditor 4的autoParagraph: Boolean已被弃用。 - GibboK
显示剩余7条评论

34
在互联网上,人们注意到将config.enterMode设置为CKEDITOR.ENTER_BR会从CKEditor中删除包裹段落标签的功能。值得注意的是,该设置更改回车键的行为,以插入换行符而不是段落,这是不可取的。
参见:http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.config.html#.enterMode,“建议使用CKEDITOR.ENTER_P设置,因为它具有语义价值和正确性。”
但是,旨在删除初始段落的设置config.autoParagraph也不可取,因为它会引入“不可预测的可用性问题”,因为编辑器确实希望有一个顶层块元素。
参见:http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.config.html#.autoParagraph 魔法发生在wysiwygarea/plugin.js的第410行,其中编辑器根据config.enterMode选择默认的块元素。更改默认块元素的配置选项将允许我们从div开始,但除非我们通过菜单更改段落格式,否则每次按回车键都会获得更多的div。
参见:http://docs.cksource.com/ckeditor_api/symbols/src/plugins_wysiwygarea_plugin.js.html 可以通过后处理(在服务器上或在CKEditor的getData事件中)删除包装段落标记,但这会导致与禁用autoParagraph相同的问题:没有顶级块。
我更愿意说没有一个好的解决方案,而是一堆半成品的解决方案,而不是接受更改config.enterMode作为规范解决方案。

1
不错的回答。我不确定我是否喜欢你对此的最终结论,但相关配置选项、它们的影响等总结很好!谢谢! - Boaz Rymland
是的,我对我的结论也不太满意。它更像是一个警告而不是解决方案! - Michael Hellein
1
那么... CKEditor 没有看到 BR 标签的语义价值?它们确实有一个用途,但如果编辑器处于 ENTER_P 模式下,它会将它们去除。 - bricker

9
尝试在config.js中进行以下操作。
CKEDITOR.editorConfig = function( config )
{
config.enterMode = CKEDITOR.ENTER_BR;
config.shiftEnterMode = CKEDITOR.ENTER_BR;
};

5

请将以下代码复制粘贴到您的 config.js 文件中:

CKEDITOR.editorConfig = function( config ) {

   //   config.enterMode = 2; //disabled <p> completely
        config.enterMode = CKEDITOR.ENTER_BR; // pressing the ENTER KEY input <br/>
        config.shiftEnterMode = CKEDITOR.ENTER_P; //pressing the SHIFT + ENTER KEYS input <p>
        config.autoParagraph = false; // stops automatic insertion of <p> on focus
    };

你忘记在CKEDITOR.ENTER_BR后面加上;了。 - MonTea

5

找到了!

在ckeditor.js的第91行...搜索

B.config.enterMode==3?'div':'p'

改为

B.config.enterMode==3?'div':''(去掉P!)

清除缓存,完成!


2

我正在做一些让我感到不自豪的解决办法。在我的Python servlet中实际保存到数据库时,我执行以下操作:

if description.startswith('<p>') and description.endswith('</p>'):
    description = description[3:-4]

6
但如果有多个段落,这样会导致类似于“第一段</p><p>第二段”的结果吗? - Max Nanasy
@MaxNanasy,CKEditor总是覆盖P标签下的值。因此,如果您的字符串是“<p> Helo </ p> <p>早上好</ p>”,那么CKEditor会将该值转换为“<p> <p> Helo </ p> <p>早上好</ p> </ p>”。derwiki的答案始终有效。 - bhargav3vedi

1
if (substr_count($this->content,'<p>') == 1)
{
  $this->content = preg_replace('/<\/?p>/i', '', $this->content);
}

如果(substr_count($this->content,'<p>') == 1) { $temp = preg_replace("/<p>/i","",$this->content); $temp = preg_replace("/</p>/i","",$temp); $this->content = $temp; } - Lars

1

编辑源代码(或关闭富文本),将p标签替换为div。然后以任何你想要的方式样式化div。

由于你已经在里面添加了div,因此ckEditor不会在下一次提交时添加任何包装元素。

(这解决了我的问题,我正在使用Drupal并需要小段HTML片段,而编辑器总是添加额外的内容,但其他时间我想要包装p标签)。


0

将此代码作为您的config.js文件

CKEDITOR.editorConfig = function( config ) {

   //   config.enterMode = 2; //disabled <p> completely
        config.enterMode = CKEDITOR.ENTER_BR // pressing the ENTER KEY input <br/>
        config.shiftEnterMode = CKEDITOR.ENTER_P; //pressing the SHIFT + ENTER KEYS input <p>
        config.autoParagraph = false; // stops automatic insertion of <p> on focus
    };

0

设置以下配置:

    CKEDITOR.config.enterMode = CKEDITOR.ENTER_BR
    CKEDITOR.config.forcePasteAsPlainText = true

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接