序言:
承接上文,ckeditor
既然不用 execCommand
,那么编辑器的格式化功能就只能通过自己手动添加格式化标签实现,一般格式化包括四步:
1.得到选择位置,
2.抽取选择节点集,
3.对节点集格式化,
4.格式化节点集加入文档,
其中第1步在标准浏览器中可以通过w3c range
直接得到,而ie
则要费些周折,而2,3,4则是真正麻烦的地方,2要保证节点集的完整性,3要防止格式化代码的冗余,4则要判断最终插入的位置。其中第2步其实w3c range已经实现,但是ck为了最大程度地兼容各个浏览器,不依赖于浏览器,使用了 dom2-core
来自己实现对应功能,毕竟参照规范:The Range interface provides methods for accessing and manipulating the document tree at a higher level than similar methods in the Node interface. The expectation is that each of the methods provided by the Range interface for the insertion, deletion and copying of content can be directly mapped to a series of Node editing operations enabled by DOM Core. In this sense, the Range operations can be viewed as convenience methods that also enable the implementation to optimize common editing patterns.(在这一点上又同css选择器引擎构建
类似)
本质上文档是DOM树,抽取插入格式化节点集都是对树进行操作,树(tree data structure)
作为计算机科学中一种重要的数据结构,在web信息抽取
,编译
(语法树
)以及自然语言处理领域
已经达到了广泛的应用,而在浏览器前端由于复杂度多由服务器承担而不受重视(近来也开始渐受关注,参见
high performance javascript
),基于浏览器的编辑器随着用户的持续修改,会对dom树产生巨大的变动,相应地树操作算法对于编辑的流畅性变得至关重要。
Demo :
ckeditor core
核心函数:
range.extractContents
对应于规范的同名函数 extractContents
,将用户选中的区域节点集完整抽取出来作为 DocumentFragment 返回:(注意连续文本节点需要 splitText
操作),并且将选择范围 collpase 到一点。
抽取前:
绿色表示文本节点,红色表示标签
抽取后得到的文档碎片:
包含了完整的选择区域节点集,需要注意
为了完整性:
起始节点所在树路径的节点必须复制下来:
抽取后的文档树:
注意从开始节点到结束节点,以DFS(深度优先)遍历遇到的节点如果不在起始节点的树路径上则直接删除:
dom.mergeSilblings :
随着用户的添加删除,必然剩下很多没有文字节点的空标签,如<span style="xx">1</span><span></span>...,ckeditor在下次添加格式标签后会进行标签合并工作:
合并前:
合并后:
style.applyInlineStyle
和规范中的 surroundContents
类似,简单的说就是调用了
extractContents 和 mergeSilblings ,生成对应的格式标签包裹抽取节点集,然后插入到原来的选择位置。不过这个函数也有一些处理:
1.range 切分
将 range 切分为一系列更小范围的 range,使得格式标签根据 xhtml dtd
嵌套规则得以能够包裹这个 range 的 html 内容,譬如选择了 p 标签以及其内的所有内容调整字体大小,但是格式标签<span style="font-size:xx"></span>并能直接包裹 p ,而只能包裹 p 内的行内元素,然后再由 p 来包裹 格式标签,遇到选择多个 p 时更需要逐一处理,即切与分。
2.抽取节点集的格式清理
,子节点重复的style属性删除
包裹后格式清理前:
<span style="xx">
<span style="xx">
zz
</span>
yy
</span>
包裹后格式清理后:
<span style="xx">
<span>
zz
</span>
yy
</span>
3.无属性,无样式的标签清理
清理前:
<span style="xx">
<span>
zz
</span>
yy
</span>
清理后:
<span style="xx">
zz
yy
</span>
总结:
上述只是大概说明了实现编辑操作的必要需求,但是性能则取决于具体算法实现,或许前端是时候看看图论
了。
PS:调试相关
建议 firefox(代表标准浏览器下)使用 firebug 调试,ie使用 ie8 自带调试工具,双屏对比调试就能对浏览器差异有更深刻的认识了:
(修订于:2010-08-08)
- 大小: 49.7 KB
- 大小: 39.3 KB
- 大小: 37.4 KB
- 大小: 42.5 KB
- 大小: 37.6 KB
- 大小: 316.2 KB
分享到:
相关推荐
ckeditor
把ckeditor 3.4的ckeditor.js复盖就行
最近项目开发需要用到CKEditor在线编辑器,但发现他本身没有自带,所以需要自己手动配置插件。但网上很多配置都有问题,自己摸索了好久终于搞定。需要注意的细节有:flvPlayer文件夹的内容直接放在ckeditor文件夹...
1、在页面中引入ckeditor核心文件ckeditor.js <script type="text/javascript" src="ckeditor/ckeditor.js"> <script type="text/javascript" src="ckfinder/ckfinder.js"></script> 2、在使用编辑器的地方插入...
集成CKEditor和CKfinder,很是纠结,发一个配置完成的,给大家分享一下。
本插件源码来自互联网,由于源代码基于ckeditor3.6.61,故对源码进行过简单修改,以求适应ckeditor4.4.7
ckeditor
之前在网上下载的都不可以用,于是想尽办法发现是网上提供的是不支持最新的ckeditor.用法找见自己的ckeditor地址让后放到ckeditor/plugins/ 下,最后修改ckeditor/config.js,如果之前添加过工具则在 config....
ckeditor4.3.2
ckeditor插件工具,ckeditor插件工具,ckeditor插件工具,ckeditor插件工具,
ckeditor最新
ckeditor5-v30 全工具版 ,基本将免费的工具备齐了,源文件,可自行修改重新打包,node_modules 文件夹为包文件,该文件夹容量较大,在实际应用时可以删除,必须在网站模式使用,如:...该版本表格插件与微软的edge...
不错编辑器 最新版本ckeditor4.0 最新版本
ckeditor文件
ckeditor4音频视频上传自定义插件
直接在ckeditor的按钮中显示文件浏览按钮,点击后打开文件浏览窗口,上传或管理文件(必须安装ckfinder先) config.js中添加名为File的按钮 config.js中添加 ... 创建目录 ...ckeditor/skins/v2/file.gif
ckeditor 行间距插件
ckeditor 4 代码插件安装 主页:wudimei.com 安装 把plugins复制到ckeditor目录中,注意是ckeditor4. 修改ckeditor/config.js,加入如下代码: CKEDITOR.editorConfig = function( config ) { // Define changes ...
ckeditor file upload
ckeditor.rar