CKEditor 自动从 div 中剥离类

Posted

技术标签:

【中文标题】CKEditor 自动从 div 中剥离类【英文标题】:CKEditor automatically strips classes from div 【发布时间】:2013-03-17 13:34:57 【问题描述】:

我在我的网站上使用CKEditor 作为后端编辑器。尽管它似乎想将代码更改为我按下源按钮时认为合适的方式,但它正在驱使我转弯。例如,如果我点击源并创建一个<div>...

<div class="myclass">some content</div>

然后它无缘无故地从&lt;div&gt; 中删除了该类,因此当我再次点击源代码时,它已更改为...

<div>some content</div>

我认为这种恼人的行为可以在 config.js 中关闭,但我一直在挖掘,在文档中找不到任何东西来关闭它。

【问题讨论】:

经过大量挖掘,我找到了解决方案,如果您进入 config.js 并设置 CKEDITOR.config.allowedContent = true;然后它会阻止编辑器乱搞。 【参考方案1】:

禁用内容过滤

最简单的解决方案是转到 config.js 并设置:

config.allowedContent = true;

记得清除浏览器的缓存)。然后CKEditor 完全停止过滤输入的内容。但是,这将完全禁用 content filtering,这是 CKEditor 最重要的功能之一。

配置内容过滤

您还可以更精确地配置CKEditor's content filter 以仅允许您需要的这些元素、类、样式和属性。这个解决方案要好得多,因为CKEditor仍然会删除浏览器在复制和粘贴内容时产生的很多糟糕的html,但它不会删除你想要的内容。

例如,您可以扩展默认 CKEditor 的配置以接受所有 div 类:

config.extraAllowedContent = 'div(*)';

或者一些 Bootstrap 的东西:

config.extraAllowedContent = 'div(col-md-*,container-fluid,row)';

或者,您可以为dtdd 元素允许带有可选dir 属性的描述列表:

config.extraAllowedContent = 'dl; dt dd[dir]';

这些只是非常基本的示例。你可以编写各种规则——需要属性、类或样式,只匹配特殊元素,匹配所有元素。您也可以禁止某些东西并完全重新定义 CKEditor 的规则。 阅读更多:

Content filtering in CKEditor – 为什么需要内容过滤器。 Advanced Content Filter – 深入描述过滤机制。 Allowed content rules – 如何编写允许的内容规则。

【讨论】:

这将禁用该功能。配置比禁用更好。 @lain Simpson:您仍然需要将此问题设置为已回答。 Thx btw 寻找解决方案:D 此解决方案有时有效,有时无效。 style 属性被删除,只是有时,其余的会保留。 我正在使用一个叫做 Kentico 的东西,它使用这个编辑器。我添加了行“CKEDITOR.config.allowedContent = true;”到我的 config.js,但它仍在重新格式化我的 HTML,这会破坏我的引导代码,有人有什么想法吗? 我正在添加 config.allowedContent = true;,在 config.js 中但仍然无法正常工作【参考方案2】:

我找到了解决办法。

这会关闭过滤,它正在工作,但不是一个好主意...

config.allowedContent = true;

使用内容字符串可以很好地用于 id 等,但不适用于类和样式属性,因为您有 () 和 用于类和样式过滤。

所以我的赌注是允许编辑器中的任何类是:

config.extraAllowedContent = '*(*)';

这允许任何类和任何内联样式。

config.extraAllowedContent = '*(*);**';

对于任何标签只允许 class="asdf1" 和 class="asdf2":

config.extraAllowedContent = '*(asdf1,asdf2)';

(所以你必须指定类名)

仅允许 p 标签使用 class="asdf":

config.extraAllowedContent = 'p(asdf)';

允许任何标签的 id 属性:

config.extraAllowedContent = '*[id]';

等等等等

要允许样式标签():

config.extraAllowedContent = 'style';

稍微复杂一点:

config.extraAllowedContent = 'span;ul;li;table;td;style;*[id];*(*);**';

希望这是一个更好的解决方案...

【讨论】:

另见ckEditor docs for extraAllowedContent 10 星为您的回答 感谢您的努力!【参考方案3】:

编辑:此答案适用于在 drupal 中使用 ckeditor 模块的人。

我找到了一个不需要修改ckeditor js文件的解决方案。

这个答案是从here 复制而来的。所有学分都应归原作者所有。

转到“管理>>配置>>CKEditor”;在个人资料下,选择您的个人资料(例如完整)。

编辑该配置文件,然后在“高级选项 >> 自定义 javascript 配置”中添加 config.allowedContent = true;

不要忘记刷新“性能选项卡”下的缓存。

【讨论】:

这个答案仅适用于drupal ...但无论如何谢谢,因为我只是在寻找一个drupal解决方案。 @LarS 很有趣。我不记得为什么我认为这个问题与 drupal 有关,但似乎它帮助了 drupal 人。【参考方案4】:

从CKEditor v4.1开始,你可以在CKEditor的config.js中做到这一点:

CKEDITOR.editorConfig = function( config ) 
  config.extraAllowedContent = '*[id](*)';  // remove '[id]', if you don't want IDs for HTML tags

the detailed syntax of Allowed Content Rules可以参考官方文档

【讨论】:

上面有语法错误。具体来说,样式属性必须使用花括号 而不是括号 () 嗨,kamelkev,根据问题,我的回答是针对 classes,而不是针对 styles。基本上我就是这么用的,我不认为它有错误。 感谢您的回答,您的*[id](*) 成功了,我之前尝试过*[id,class],但这不允许以某种方式使用类属性。 CKeditor 文档有点像迷宫。 +1 正如许多其他答案所暗示的那样,了解内容规则可能是比禁用所有过滤更好的解决方案。【参考方案5】:

如果您使用的是 ckeditor 4.x,您可以尝试

config.allowedContent = true;

如果您使用的是 ckeditor 3.x,您可能拥有this issue。

尝试将以下行放入 config.js

config.ignoreEmptyParagraph = false;

【讨论】:

在我尝试过的所有答案中,config.ignoreEmptyParagraph=false; 是唯一对我有用的解决方案。谢谢。【参考方案6】:

这在ckeditor中称为ACF(自动内容过滤器)。它会删除我们在文本内容中使用的所有不必要的标签。在您的config.js文件中使用此命令应该关闭此ACK。

config.allowedContent = true;

【讨论】:

【参考方案7】:

请参考official Advanced Content Filter guide 和plugin integration tutorial。

您会发现这个强大的功能远不止这些。另请参阅似乎适合您需求的config.extraAllowedContent。

【讨论】:

【参考方案8】:

以下是 CKEDITOR 4.x 的完整示例:

HTML

<textarea name="post_content" id="post_content" class="form-control"></textarea>

脚本

CKEDITOR.replace('post_content', 
   allowedContent:true,
);

以上代码将允许编辑器中的所有标签。

更多详情:CK EDITOR Allowed Content Rules

【讨论】:

【参考方案9】:

如果您将 Drupal 和名为“WYSIWYG”的模块与 CKEditor 库一起使用,则以下解决方法可能是一个解决方案。对我来说,它就像一种魅力。我在 Drupal 7.33 中使用 CKEditor 4.4.5 和 WYSIWYG 2.2。我在这里找到了这个解决方法:https://www.drupal.org/node/1956778。

这里是: 我创建了一个自定义模块并将以下代码放入“.module”文件中:

<?php
/**
 * Implements hook_wysiwyg_editor_settings_alter().
 */
function MYMODULE_wysiwyg_editor_settings_alter(&$settings, $context) 
  if ($context['profile']->editor == 'ckeditor') 
    $settings['allowedContent'] = TRUE;
  

?>

我希望这对其他 Drupal 用户有所帮助。

【讨论】:

感谢这个 Drupal 的回答【参考方案10】:

我发现切换到使用完整 html 而不是过滤后的 html(在文本格式下拉框中的编辑器下方)为我解决了这个问题。否则样式会消失。

【讨论】:

【参考方案11】:

我想添加这个 config.allowedContent = true;需要添加到 ckeditor.config.js 文件而不是 config.js,config.js 对我没有任何作用,但将其添加到 ckeditor.config.js 的顶部区域保留了我的 div 类

【讨论】:

【参考方案12】:

如果使用 drupal,另一个选择是简单地添加您想要使用的 css 样式。这样它就不会去掉样式或类名。

所以在我的情况下,在 drupal 7 的 css 选项卡下只需添加类似

facebook=span.icon-facebook2

还要检查字体样式按钮是否已启用

【讨论】:

【参考方案13】:

我在使用 ckeditor 4.7.1 的 chrome 上遇到了同样的问题。只需在 ckeditor instanceReady 上禁用 pasteFilter。此属性禁用高级内容过滤器(ACF)的所有过滤器选项。

 CKEDITOR.on('instanceReady', function (ev) 
        ev.editor.pasteFilter.disabled = true;
    );

【讨论】:

以上是关于CKEditor 自动从 div 中剥离类的主要内容,如果未能解决你的问题,请参考以下文章

CKEditor4 x部署和配置

错误:ckeditor-duplicated-modules:某些 CKEditor 5 模块重复

CKEditor 版本 4.5.3 与 ASP.NET 集成

从 WKWebview 中删除/剥离 HTML 类

将ckeditor应用于textarea

PHP DOM获取nodevalue html? (不剥离标签)