CKEditorはdivからクラスを自動的に取り除きます


140

私のウェブサイトでは、CKEditorをバックエンドエディターとして使用しています。ソースボタンを押すたびにコードが適切に見えるようにコードを変更したいので、曲がり角を曲がっています。たとえば、ソースにアクセスして<div>...

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

その後、明らかな理由もなく、クラスがから削除<div>されます。そのため、もう一度ソースにアクセスすると、次のように変更されています...

<div>some content</div>

この苛立たしい動作はで無効にできるとconfig.js思いますが、私は掘り下げていて、無効にするためのドキュメントを見つけることができません。


8
config.jsに移動してCKEDITOR.config.allowedContent = trueを設定すると、多くの調査の結果、解決策が見つかりました。それにより、エディターが物事をいじるのを停止します。
Iain Simpson

回答:


284

コンテンツフィルタリングの無効化

最も簡単な解決策は、config.jsと設定に行くことです:

config.allowedContent = true;

ブラウザのキャッシュをクリアすることを忘れないでください)。その後、CKEditorは入力されたコンテンツのフィルタリングを停止します。ただし、これにより、CKEditorの最も重要な機能の1つであるコンテンツフィルタリングが完全に無効になります。

コンテンツフィルタリングの構成

また、CKEditorのコンテンツフィルターをより正確に構成して、必要な要素、クラス、スタイル、および属性のみを許可することもできます。このソリューションの方がはるかに優れています。CKEditorは、コンテンツをコピーして貼り付けたときにブラウザーが生成する不正確なHTMLの多くを削除しますが、必要なコンテンツを削除しません。

たとえば、デフォルトのCKEditorの構成を拡張して、すべてのdivクラスを受け入れることができます。

config.extraAllowedContent = 'div(*)';

またはいくつかのブートストラップのもの:

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

またはdirdtdd要素のオプションの属性を含む説明リストを許可できます。

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

これらは非常に基本的な例にすぎません。すべての種類のルールを記述できます-必須の属性、クラス、またはスタイル、特別な要素のみの一致、すべての要素の一致。また、ものを禁止して、CKEditorのルールを完全に再定義することもできます。続きを読む:


3
これにより、機能が無効になります。無効にするより構成する方が良い。
oleq 2013

1
@lain Simpson:この質問に回答済みとして設定する必要があります。解決策を見つけるためのThx btw:D
Jacob van Lingen

1
このソリューションが機能する場合と機能しない場合があります。スタイル属性は削除されますが、残りは残ります。
machineaddict 2013

2
このエディタを使用するKenticoと呼ばれるものを使用しています。「CKEDITOR.config.allowedContent = true;」という行を追加しました。私のconfig.jsに、それでも私のHTMLを再フォーマットしていますが、これは私のBootstrapコードを壊します、誰かが何かアイデアを持っていますか?
Tom Bowen、2014年

1
完璧なソリューションをありがとう。私にとってデイセーバー。
スーニー2014

61

解決策を見つけました。

これはフィルタリングをオフにします、それは機能していますが、良い考えではありません...

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]';

などなど

スタイルタグ(<style type = "text / css"> ... </ style>)を許可するには:

config.extraAllowedContent = 'style';

もう少し複雑に:

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

それがより良い解決策であることを願っています...


1
これがta superberbある
Rippo


回答の10つ星
Brijesh Mavani

あなたの努力に対する称賛!
ミシェル

15

編集:この回答はdrupalでckeditorモジュールを使用する人向けです。

ckeditor jsファイルの変更を必要としないソリューションを見つけました。

この答えはここからコピーされます。すべてのクレジットは原作者に送られるべきです。

「管理>>設定>> CKEditor」に移動します。[プロファイル]で、プロファイル(フルなど)を選択します。

そのプロファイルを編集し、「詳細オプション>>カスタムJavaScript設定」でを追加しconfig.allowedContent = true;ます。

ここに画像の説明を入力してください

「パフォーマンス」タブでキャッシュをフラッシュすることを忘れないでください。


4
この回答はdrupalのみを対象としています...とにかく私はdrupalソリューションを探していたので、ありがとうございます。
LarS 2014

1
@LarS興味深い。この質問がdrupalに関連していると思った理由を思い出せませんが、drupalの人たちを助けたようです。
sepehr 2014

14

CKEditor v4.1以降、CKEditorのconfig.jsでこれを行うことができます。

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

許可されたコンテンツルールの詳細な構文について、公式ドキュメントを参照してください。


上記の構文エラーがあります。特にスタイル属性は、括弧()ではなく中括弧{}で設定する必要があります
kamelkev

こんにちはカメルケフ、私の質問は、スタイルではなくクラスです。基本的に、それは私が使用しているものであり、エラーがあるとは思いません。
Marty ZHANG 2013

答えをありがとう、あなた*[id](*)はトリックをしました、私は*[id,class]以前試しましたが、それはクラス属性をどういうわけか許可しません。CKeditorのドキュメントは少し迷路のようなものです。
GDmac、2013

1
+1コンテンツルールを理解することは、他の多くの回答が示唆しているように、すべてのフィルタリングを無効にするよりもおそらく良い解決策です。
Michael Martin-Smucker 14

10

ckeditor 4.xを使用している場合は、試すことができます

config.allowedContent = true;

ckeditor 3.xを使用している場合は、この問題が発生している可能性があります。

config.jsに次の行を入れてみてください

config.ignoreEmptyParagraph = false;

config.ignoreEmptyParagraph=false;私が試したすべての答えの中で、私にとってうまくいった唯一の解決策です。ありがとうございました。
ステファン

9

これはckeditorではACF(Automatic Content Filter)と呼ばれます。テキストコンテンツで使用されている不要なタグをすべて削除します。config.jsファイルでこのコマンドを使用すると、このACKがオフになります。

config.allowedContent = true;


4

Drupalと、CKEditorライブラリで「WYSIWYG」と呼ばれるモジュールを使用する場合、次の回避策が解決策になる可能性があります。私にとってそれは魅力のように機能します。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ユーザーの役に立てば幸いです。




0

フィルターされたhtmlの代わりに完全なhtmlを使用するように切り替える([テキスト形式]ドロップダウンボックスのエディターの下にある)と、この問題が解決しました。そうしないと、スタイルが消えてしまいます。


0

このconfig.allowedContent = true;を追加します。config.jsではなくckeditor.config.jsファイルに追加する必要があります。config.jsは何もしませんでしたが、ckeditor.config.jsの上部に追加すると、divクラスが保持されます


0

drupalを使用する場合の別のオプションは、使用するCSSスタイルを追加することです。そうすれば、スタイルやクラス名が取り除かれることはありません。

だから私の場合はdrupal 7のcssタブの下に単純に次のようなものを追加します

facebook = span.icon-facebook2

フォントスタイルボタンが有効になっていることも確認してください


0

ckeditor 4.7.1を使用すると、Chromeでも同じ問題が発生します。ckeditor instanceReadyのpasteFilterを無効にするだけです。このプロパティは、Advance Content Filter(ACF)のすべてのフィルターオプションを無効にします。

 CKEDITOR.on('instanceReady', function (ev) {
        ev.editor.pasteFilter.disabled = true;
    });
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.