CKEditor tự động loại bỏ các lớp từ div


140

Tôi đang sử dụng CKEditor làm trình chỉnh sửa back end trên trang web của mình. Nó đang khiến tôi đi vòng qua khúc quanh mặc dù dường như muốn thay đổi mã theo cách nó thấy phù hợp mỗi khi tôi nhấn nút nguồn. Ví dụ: nếu tôi nhấn nguồn và tạo <div>...

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

Sau đó, không có lý do rõ ràng nào loại bỏ lớp khỏi <div>, vì vậy khi tôi nhấn lại nguồn, nó đã được đổi thành ...

<div>some content</div>

Tôi cho rằng hành vi gây khó chịu này có thể bị tắt trong config.js, nhưng tôi đã đào và không thể tìm thấy bất cứ điều gì trong tài liệu để tắt nó.


8
Tôi đã tìm thấy giải pháp sau khi đào nhiều, nếu bạn vào config.js và đặt CKEDITOR.config.allowedContent = true; Nó dừng trình soạn thảo làm rối tung mọi thứ sau đó.
Iain Simpson

Câu trả lời:


284

Vô hiệu hóa lọc nội dung

Giải pháp đơn giản nhất là vào config.js và cài đặt:

config.allowedContent = true;

( Hãy nhớ xóa bộ nhớ cache của trình duyệt ). Sau đó, CKEditor ngừng lọc nội dung được nhập vào. Tuy nhiên, điều này sẽ hoàn toàn vô hiệu hóa tính năng lọc nội dung , một trong những tính năng quan trọng nhất của CKEditor.

Cấu hình lọc nội dung

Bạn cũng có thể định cấu hình bộ lọc nội dung của CKEditor chính xác hơn để chỉ cho phép các thành phần, lớp, kiểu và thuộc tính này mà bạn cần. Giải pháp này tốt hơn nhiều, vì CKEditor vẫn sẽ xóa rất nhiều HTML nhảm nhí mà trình duyệt tạo ra khi sao chép và dán nội dung, nhưng nó sẽ không loại bỏ nội dung bạn muốn.

Ví dụ: bạn có thể mở rộng cấu hình CKEditor mặc định để chấp nhận tất cả các lớp div:

config.extraAllowedContent = 'div(*)';

Hoặc một số công cụ Bootstrap:

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

Hoặc bạn có thể cho phép danh sách mô tả với các dirthuộc tính dtddyếu tố tùy chọn :

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

Đây chỉ là những ví dụ rất cơ bản. Bạn có thể viết tất cả các loại quy tắc - yêu cầu thuộc tính, lớp hoặc kiểu, chỉ khớp các phần tử đặc biệt, khớp với tất cả các phần tử. Bạn cũng có thể không cho phép các công cụ và xác định lại hoàn toàn các quy tắc của CKEditor. Đọc thêm về:


3
Điều này sẽ vô hiệu hóa tính năng. Cấu hình tốt hơn là vô hiệu hóa.
oleq

1
@lain Simpson: Bạn vẫn cần đặt câu hỏi này như đã trả lời. Thx btw vì đã tìm ra giải pháp: D
Jacob van Lingen

1
Đôi khi giải pháp này có hiệu quả, đôi khi không. Thuộc tính style được loại bỏ, chỉ đôi khi, phần còn lại ở lại.
máy móc

2
Tôi đang làm việc với một cái gì đó gọi là Kentico, sử dụng trình soạn thảo này. Tôi đã thêm dòng "CKEDITOR.config.allowedContent = true;" với config.js của tôi, nhưng nó vẫn đang định dạng lại HTML của tôi, điều này phá vỡ mã Bootstrap của tôi, có ai có ý tưởng gì không?
Tom Bowen

1
Cảm ơn giải pháp hoàn hảo. Một ngày tiết kiệm cho tôi.
Sớm

61

Tôi tìm thấy một giải pháp.

Điều này tắt bộ lọc, nó hoạt động, nhưng không phải là một ý tưởng tốt ...

config.allowedContent = true;

Để chơi với một chuỗi nội dung hoạt động tốt cho id, v.v., nhưng không phải cho các thuộc tính lớp và kiểu, bởi vì bạn có () và {} cho lọc lớp và kiểu.

Vì vậy, đặt cược của tôi là cho phép bất kỳ lớp nào trong trình soạn thảo là:

config.extraAllowedContent = '*(*)';

Điều này cho phép bất kỳ lớp và bất kỳ phong cách nội tuyến.

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

Để chỉ cho phép class = "asdf1" và class = "asdf2" cho bất kỳ thẻ nào:

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

(vì vậy bạn phải chỉ định tên lớp)

Để chỉ cho phép class = "asdf" chỉ cho thẻ p:

config.extraAllowedContent = 'p(asdf)';

Để cho phép thuộc tính id cho bất kỳ thẻ nào:

config.extraAllowedContent = '*[id]';

Vân vân

Để cho phép thẻ kiểu (<style type = "text / css"> ... </ style>):

config.extraAllowedContent = 'style';

Để phức tạp hơn một chút:

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

Hy vọng nó là một giải pháp tốt hơn ...


1
đây là superberb ta
Rippo


10 sao cho câu trả lời của bạn
Brijesh Mavani

Kudos cho nỗ lực của bạn!
Michel

15

Chỉnh sửa : câu trả lời này dành cho những người sử dụng mô đun ckeditor trong drupal.

Tôi tìm thấy một giải pháp không yêu cầu sửa đổi tập tin js ckeditor.

Câu trả lời này được sao chép từ đây . tất cả các khoản tín dụng nên đến tác giả gốc.

Chuyển đến "Quản trị viên >> Cấu hình >> CKEditor"; trong Hồ sơ, chọn hồ sơ của bạn (ví dụ: Đầy đủ).

Chỉnh sửa cấu hình đó và trên "Tùy chọn nâng cao >> Cấu hình JavaScript tùy chỉnh" thêm config.allowedContent = true;.

nhập mô tả hình ảnh ở đây

Đừng quên xóa bộ đệm trong "Tab hiệu suất."


4
Câu trả lời này chỉ dành cho drupal ... nhưng dù sao cũng cảm ơn, vì tôi chỉ đang tìm kiếm một giải pháp drupal.
LarS

1
@LarS thú vị. Tôi không thể nhớ tại sao tôi nghĩ câu hỏi này có liên quan đến drupal, nhưng có vẻ như nó đã giúp những kẻ say rượu.
sepehr

14

Kể từ CKEditor v4.1, bạn có thể thực hiện việc này trong config.js của CKEditor:

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

Bạn có thể tham khảo tài liệu chính thức về cú pháp chi tiết của Quy tắc nội dung được phép


Có một lỗi cú pháp bạn đã có ở trên. Các thuộc tính kiểu cụ thể phải được đặt bằng các đường cong xoăn {} thay vì parens ()
kamelkev

Xin chào kamelkev, câu trả lời của tôi là dành cho các lớp học , không phải cho phong cách , theo câu hỏi. Về cơ bản, đó là những gì tôi đang sử dụng và tôi không nghĩ rằng nó có lỗi.
Marty ZHANG

Cảm ơn câu trả lời, bạn *[id](*)đã thực hiện thủ thuật này, tôi đã thử *[id,class]trước đây, nhưng điều đó không cho phép thuộc tính lớp bằng cách nào đó. Tài liệu của CKeditor hơi giống một mê cung.
GDmac

1
+1 Hiểu các quy tắc nội dung có lẽ là một giải pháp tốt hơn so với việc vô hiệu hóa tất cả các bộ lọc, như nhiều câu trả lời khác đề xuất.
Michael Martin-Smucker

10

nếu bạn đang sử dụng ckeditor 4.x, bạn có thể thử

config.allowedContent = true;

nếu bạn đang sử dụng ckeditor 3.x, bạn có thể gặp vấn đề này .

hãy thử đặt dòng sau vào config.js

config.ignoreEmptyParagraph = false;

config.ignoreEmptyParagraph=false;là giải pháp duy nhất hiệu quả với tôi, trong số tất cả các câu trả lời tôi đã thử. Cảm ơn bạn.
Stefan

9

Đây được gọi là ACF (Bộ lọc nội dung tự động) trong ckeditor. Nó xóa tất cả các thẻ đơn nhất là những gì chúng ta đang sử dụng trong nội dung văn bản. Sử dụng lệnh này trong tệp config.js của bạn sẽ tắt ACK này.

config.allowedContent = true;


4

Nếu bạn sử dụng Drupal VÀ mô-đun có tên "WYSIWYG" với thư viện CKEditor, thì cách giải quyết sau đây có thể là một giải pháp. Đối với tôi nó hoạt động như một lá bùa. Tôi sử dụng CKEditor 4.4.5 và WYSIWYG 2.2 trong Drupal 7.33. Tôi tìm thấy cách giải quyết này tại đây: https://www.drupal.org/node/1956778 .

Đây là: Tôi tạo một mô-đun tùy chỉnh và đặt đoạn mã sau vào tệp ".module":

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

Tôi hy vọng điều này sẽ giúp những người dùng Drupal khác.


Cảm ơn câu trả lời drupal này
tái hiện

3

Sau đây là ví dụ đầy đủ cho CKEDITOR 4.x :

HTML

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

KỊCH BẢN

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

Đoạn mã trên sẽ cho phép tất cả các thẻ trong trình chỉnh sửa.

Để biết thêm chi tiết: Quy tắc nội dung được phép của ED EDITOR


0

Tôi thấy rằng việc chuyển sang sử dụng html đầy đủ thay vì html được lọc (bên dưới trình chỉnh sửa trong hộp thả xuống Định dạng văn bản) là điều đã khắc phục vấn đề này đối với tôi. Nếu không thì phong cách sẽ biến mất.


0

Tôi muốn thêm config.allowedContent = true; cần phải được thêm vào tệp ckeditor.config.js không phải là config.js, config.js không làm gì cho tôi ngoài việc thêm nó vào khu vực hàng đầu của ckeditor.config.js giữ các lớp div của tôi


0

Một tùy chọn khác nếu sử dụng drupal chỉ đơn giản là thêm kiểu css mà bạn muốn sử dụng. theo cách đó, nó không loại bỏ phong cách hoặc tên lớp.

vì vậy trong trường hợp của tôi dưới tab css trong drupal 7 chỉ cần thêm một cái gì đó như

facebook = span.icon-facebook2

đồng thời kiểm tra xem nút kiểu chữ có được bật không


0

Tôi gặp vấn đề tương tự trên chrome với ckeditor 4.7.1. Chỉ cần vô hiệu hóa pasteFilter trên ckeditor dụReady. Thuộc tính này vô hiệu hóa tất cả các tùy chọn bộ lọc của Bộ lọc nội dung nâng cao (ACF).

 CKEDITOR.on('instanceReady', function (ev) {
        ev.editor.pasteFilter.disabled = true;
    });
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.