-1

在我正在编写的 CKEditor 插件中,我需要创建一个新的空段落。

我知道<p></p>大多数浏览器会折叠空段落 (),这就是为什么 CKEditor 对它们进行一些特殊处理的原因:

  • 显示 HTML 源代码时,CKEditor 显示<p>&nbsp;</p>一个空段落(例如,当您按两次 Enter 键时)
  • 根据浏览器的不同,CKEditor 在编辑区域用另一个占位符填充段落。例如,在 Mozilla Firefox 中,它会<br type="_moz" />在段落中插入 a。

但是,当手动插入一个pDOM 节点时(使用 CKEditor dom 对象),这种特殊处理就被省略了。不过,当我切换到源视图并返回编辑模式时,它会神奇地出现。

我试过了:

var new_p = new CKEDITOR.dom.element('p');
editor.insertElement(new_p);

和:

var new_p = new CKEDITOR.dom.element.createFromHtml('<p></p>');
editor.insertElement(new_p);

并且:

editor.insertHtml('<p>');

但是没有对空段落进行特殊处理。我得到一个空段落,但由于浏览器正在折叠它,我无法正确查看或编辑其内容。

当来回切换到源代码视图时,CKEditor 检测到空段落并插入填充符。提交数据时也是如此。但是我需要在插入新节点时立即出现填充符。

我如何让 CKEditor 处理我的新段落,就像它在用户按两次 Enter 时创建的任何其他空段落一样?

我知道我也可以&nbsp;手动将 HTML 内容作为 HTML 内容插入到新的 DOM 节点,但这是一个巨大的区别——因为在这种情况下,空间确实出现在编辑区域中,所以当用户在新段落中输入内容时,他必须删除非破坏空间手动。

4

1 回答 1

1

在研究了 CKEditor 如何在内部处理 [ENTER] 的按下后,我得出了这个解决方案:

var new_node = new CKEDITOR.dom.element( 'p' );

// insert UTF-16 non-breaking space
var dummy = editor.document.createText( '\u00A0' );
dummy.appendTo( new_node );
editor.insertElement(new_node);

// move cursor to beginning of new element
var range = editor.createRange();
range.moveToPosition( new_node, CKEDITOR.POSITION_AFTER_START );
editor.getSelection().selectRanges( [ range ] );
于 2013-11-13T23:23:05.947 回答