2014-01-29 95 views
1

我开始在我的一个项目中使用CKEditor并喜欢它。我无法弄清楚(或发现)的一件事是如何在另一个元素中禁止一个元素。我想禁止p发生在表格单元thtd内。CKEditor:如何从表格单元中删除p元素?

此:

<table> 
    <tr> 
     <td> 
      <p>Foo</p>   
     </td> 
    </tr> 
</table> 

应该转换为这样的:

<table> 
    <tr> 
     <td>Foo</td> 
    </tr> 
</table> 

一个CSS技巧来隐藏款造型是不是一种选择。

table p { margin: 0; } /* I don't want this! */ 

我CKEditor的初始化是这样的:

CKEDITOR.replace('id_text', { 
    allowedContent: 'table(table); table(table-striped); thead tbody tfoot tr td th;', 
    toolbar: [ 
     ['Source'], 
     ['Format'], 
     ['Table'] 
    ] 
}); 

看来,allowedContent财产不处理父子规则。当其他元素发生时,如何过滤元素?

回答

0

我无法找到内置CKEditor设置来禁止在其他标签中出现标签。但是我确实找到了CKEditor筛选内容的例子,编号为SOblog

这些文章和缺少'disallowContent'设置让我转向另一个方向:清洁粘贴+服务器端干净。

CKEditor的火灾信号on eventspasteinsertHtmlmode变化等下一个脚本添加上粘贴的监听器。所有出现的“Foo”将被替换为“Bar”。

CKEDITOR.on('instanceReady', function(ev) { 
    ev.editor.on('paste', function(evt) { 
    evt.data.dataValue = evt.data.dataValue.replace(/Foo/g, 'Bar'); 
    }, 9); 
}); 

我在Django管理站点使用CKEditor,并有jQuery可用。下一个脚本将上面的内容与jQuery DOM操作相结合每个选定的元素将被替换为它自己的内容。

var $ = django.jQuery; 

CKEDITOR.on("instanceReady", function(ev) { 
    ev.editor.on("paste", function(evt) { 
     var data = $.parseHTML(evt.data.dataValue); 
     $("th p, td p", data).each(function() { 
      $(this).replaceWith( $(this).contents()); 
      }); 
     evt.data.dataValue = $('<div>').append(data).html(); 
     }, 9); 
    }); 

注意:仍然可以通过源模式或格式菜单在表格单元格中插入段落。这些段落不被禁止或删除。我选择清理数据服务器端。