Javascript 限制CKEditor中的特定嵌套

Javascript 限制CKEditor中的特定嵌套,javascript,ckeditor,Javascript,Ckeditor,tl;dr我不想在中允许嵌套表 我试图尽可能地限制我的编辑器中允许的html。我试图实施的规则之一是只允许根目录中的表,而绝对不允许嵌套表。这就是我的问题。。。 我尝试过使用允许的内容,禁止的内容配置条目,并尝试更改CKEDITOR.dtd,但到目前为止没有任何效果 // doesnt seem to do anything // CKEDITOR.dtd.$blockLimit.table = 0; // cannot create table at all // CKEDITOR.dtd.

tl;dr我不想在中允许嵌套表

我试图尽可能地限制我的编辑器中允许的html。我试图实施的规则之一是只允许根目录中的表,而绝对不允许嵌套表。这就是我的问题。。。 我尝试过使用
允许的内容
禁止的内容
配置条目,并尝试更改
CKEDITOR.dtd
,但到目前为止没有任何效果

// doesnt seem to do anything
// CKEDITOR.dtd.$blockLimit.table = 0;

// cannot create table at all
// CKEDITOR.dtd.td.table = 0;

CKEDITOR.replace('editor1', {
    customConfig: '',
    toolbarGroups: [
        { name: 'blocks', groups: [ 'insert'] }
    ],
    removeButtons: 'Image,HorizontalRule,SpecialChar,Blockquote',
    // disallowedContent: {
    //     table: {
    //         match: function( element ) {
    //             no way to access what the parent element is
    //         }
    //     }
    // }
});

我更新了您的,现在它删除了嵌套表标记,但保留了其内容:

CKEDITOR.replace('editor1', {
    customConfig: '',
    toolbarGroups: [
        { name: 'blocks', groups: [ 'insert'] }
    ],
    removeButtons: 'Image,HorizontalRule,SpecialChar,Blockquote',
    disallowedContent: {
         tr: {
             match: function( element ) {
                 var parentTableCount = 0;
                 for (var elem = element.parent; elem; elem = elem.parent)
                 {
                     if (elem.name == 'table')
                         parentTableCount++;

                     if (parentTableCount > 1)
                         return true;
                 }
             }
         },
         table: {
             match: function( element ) {
                 for (var elem = element.parent; elem; elem = elem.parent)
                 {
                     if (elem.name == 'table')
                         return true;
                 }
             }
         }
    }
});

您可能需要根据自己的需要对其进行调整,因为我的示例主要展示了如何访问父元素。希望能有所帮助。

毕竟在dtd中找到了解决方案。从
CKEDITOR.dtd.td
中删除
table
导致无法创建表的问题是CKEDITOR中的一个bug

CKEDITOR.dtd.td
指向与
CKEDITOR.dtd.body
相同的对象,以及其他一些对象。因此,如果我只想更改
CKEDITOR.dtd.td
我需要复制一个对象引用并处理它

// using Lo-Dash to create a copy of the object
CKEDITOR.dtd.td = _.merge({}, CKEDITOR.dtd.td);
delete CKEDITOR.dtd.td.table;

CKEDITOR.replace('editor1', {
    customConfig: '',
    toolbarGroups: [
        { name: 'blocks', groups: [ 'insert'] }
    ],
    removeButtons: 'Image,HorizontalRule,SpecialChar,Blockquote'
});
当光标位于表格单元格内时,这将提供灰显按钮的预期结果,而当光标位于主体内时,则提供普通按钮的预期结果


请参阅更新的。

您的示例将表格从初始内容中整齐地删除,但在编辑时不会阻止在单元格中添加表格。在编辑
元素时。无论光标在哪里,父项似乎总是
未定义的