自定义标签有哪些问题?在哪些浏览器上?
我检查了 CKEditor 保留了这个标签,但是用它包装了整个内容。为避免这种情况,您必须编辑CKEDITOR.dtd
,即:
CKEDITOR.dtd.$empty[ 'r:product_listing' ] = 1;
但这可能还不够。为了获得更好的支持,您需要对此对象进行更多更改 - 特别重要的是定义可以是其父对象以及它是内联标记。例如:
CKEDITOR.dtd.p[ 'r:product_listing' ] = 1; // it is allowed in <p> tag
CKEDITOR.dtd.$inline[ 'r:product_listing' ] = 1;
这可能还不够——例如,您很可能没有复制和粘贴支持。
因此,如果您需要更可靠的支持,我会尝试一些不同的方式。使用CKEDITOR.dataProcessor,您可以在将数据加载到编辑器中并在检索数据时将其转换回该标签时将此标签转换为正常标签。
示例解决方案:
// We still need this, because this tag has to be parsed correctly.
CKEDITOR.dtd.p[ 'r:product_listing' ] = 1;
CKEDITOR.dtd.$inline[ 'r:product_listing' ] = 1;
CKEDITOR.dtd.$empty[ 'r:product_listing' ] = 1;
CKEDITOR.replace( 'editor1', {
on: {
instanceReady: function( evt ) {
var editor = evt.editor;
// Add filter for html->data transformation.
editor.dataProcessor.dataFilter.addRules( {
elements: {
'r:product_listing': function( element ) {
// Span isn't self closing element - change that.
element.isEmpty = false;
// Save original element name in data-saved-name attribute.
element.attributes[ 'data-saved-name' ] = element.name;
// Change name to span.
element.name = 'span';
// Push zero width space, because empty span would be removed.
element.children.push( new CKEDITOR.htmlParser.text( '\u200b' ) );
}
}
} );
// Add filter for data->html transformation.
editor.dataProcessor.htmlFilter.addRules( {
elements: {
span: function( element ) {
// Restore everything.
if ( element.attributes[ 'data-saved-name' ] ) {
element.isEmpty = true;
element.children = [];
element.name = element.attributes[ 'data-saved-name' ];
delete element.attributes[ 'data-saved-name' ]
}
}
}
} );
}
}
} );
现在r:product_listing
元素将被转换为跨度,其内部具有零宽度空间。在编辑器内部会有一个正常的跨度,但在源模式和通过editor#getData()
方法获取的数据中,您会看到原始r:product_listing
标签。
我认为这个解决方案应该是最安全的。例如复制和粘贴作品。