我是CKEditor
的新手,编写我的第一个插件,我无法在任何地方找到答案。
我有一个插件,它在源代码中创建一个只包含文本!!!!!NEWSTABLE!!!!!
的div元素。 class属性设置为newsDiv
。在WYSIWYG编辑器中,我只是希望它显示一个假的占位符元素。这很好用,问题是当我在源模式下切换回WYSIWYG模式后,它会在插入的div的上方和下方插入空白段落标记。
将enterMode切换为CKEDITOR.ENTER_BR
会修复此问题,但我仍然希望使用enter键来创建段落而不是分隔符。
我的插件代码(受flash插件源代码启发)如下:
(function() {
function isNewsEmbed(element) {
return (element.attributes.class == 'newsDiv');
}
function createFakeElement(editor, realElement) {
return editor.createFakeParserElement(realElement, 'cke_news', 'div', false);
}
CKEDITOR.plugins.add('newsTable', {
init: function(editor) {
var pluginName = 'newsTable';
editor.ui.addButton('NewsTable', {
label: 'Add News Section',
icon: 'https://d26h7uo9h7bqnn.cloudfront.net/famfamfam/newspaper_add.png',
command: pluginName
});
editor.addCommand(pluginName, {
exec: function(editor) {
var node = new CKEDITOR.dom.element('div');
node.setAttribute('class', 'newsDiv');
node.setHtml('!!!!!NEWSTABLE!!!!!');
elem = editor.createFakeElement(node, 'cke_news', 'div', false)
editor.insertElement(elem);
}
});
var css = 'img.cke_news{' +
'background-image: url(' + CKEDITOR.getUrl( this.path + 'images/placeholder.png' ) + ');' +
'background-position: center center;' +
'background-repeat: no-repeat;' +
'border: 1px solid #a9a9a9;' +
'width: 80px;' +
'height: 80px;' +
'}';
editor.addCss(css);
},
afterInit: function(editor) {
var dataProcessor = editor.dataProcessor,
dataFilter = dataProcessor && dataProcessor.dataFilter;
if (dataFilter) {
dataFilter.addRules({
elements: {
'div' : function( element ) {
var attributes = element.attributes,
classId = attributes.classid && String( attributes.classid ).toLowerCase();
if (!classId && isNewsEmbed(element)){
return createFakeElement( editor, element );
}
return null;
}
}
});
}
},
requires : [ 'fakeobjects' ]
});
})();
按下激活此插件的按钮后,按“源”并按预期...
<p>
<div class="newsDiv">
!!!!!NEWSTABLE!!!!!</div>
</p>
然而,如果从那里进入WYSIWYG模式并再次返回(没有做任何其他事情),代码已经改为以下,我不期望。
<p>
</p>
<div class="newsDiv">
!!!!!NEWSTABLE!!!!!</div>
<p>
</p>
我做错了什么?
答案 0 :(得分:3)
我知道这是一个相当晚的答案(我正在寻找解决另一个问题,偶然发现了这个问题),但你不能这样做的原因是因为<p>
和{{1} }标签是“块级”元素,并且您不能将块级元素放在另一个块级元素中。 (这只是无效的HTML)。
CKEditor会以你上面看到的方式自动修复它。