最近一直超级忙,忙着研究编辑器,研究了一段时间,出来跟大家分享一下我的心得
ckeditor她太好了,因为他开源,并且做的很强大(源码不压缩7万多行),之所以研究她是因为,一般我们做编辑器基本都是靠execCommand命令来实现的
缺点不用说,兼容性不好,就是同个浏览器不同版本也有差别,所以ck她自己实现了execCommand的各个命令,当然在她的最新的truck中也稍微有一点是用的原生的,但他标志为todo,呵呵
如果你想研究ck编辑器,那让小弟先来介绍一下他的核心的几个类
_source下的dom是最基础的实现了
因为在编辑器的世界里,textNode 是你打交道最多的元素了,但是很多框架这个都是忽略的,而且如果你用那你杯具了肯定报错,比如contains,之类的
所以在ck中设计了一套底层的核心代码来做这个事情
基类domobject他是根,实现什么自定义事件绑定啦,触发了什么的
继承他的是node这个是包括element, text , document的类,他实现了一些公共的方法,比如getNext,getPrevious之类的
他之下就是
element text document(因为编辑器都是iframe这个document是iframe中的document) window同左iframe中的window
range这个太重要了,做编辑器必须的,就跟你要上wc要有手纸一样,他的作用就是体现你现在选中了那,光标在哪,等等
walker 这个也很有用,看名字就是走,按着一定的规制便利编辑器中的dom树
dtd 这个也肥肠肥肠的重要,看了他的代码感觉他也是从别人那扒来的,所以都是a b c这样的,这个告诉你那个元素他是块结构的,那个是inline的,那个能放在那个下,那个不能
比如<b>能发在p下,但你不能把p放在b下
还有几个没在他的他的core,但也肥肠重要
放在了plugin下
是
selection这个是range的亲爹,没有他你就不能找到代表你选中的那个range,(当然range是可以new 的,但new的range是什么都不选的,就是跟你当前的页面的状态无关,就是Range类)
style 这个也老有用了,简单的说就是你想把选中的文字加粗,那么就是range.js里的方法,把你的选中的生成的相应的range对象给style,style负责对这个range进行分析和加粗
好了上边几个js就基本上是ck来实现execCommand的原生命令的核心代码了,如果你想搞编辑器,那上边的你必看(虽然觉得你是傻子,因为你要搞编辑器,编辑器这个东西基本就是bug满天飞的东西)
接下来跟大家说说当然你选中一段文字时,你点b她就加粗了,后台的实现机制,我先聊个大致的,以后在慢慢和大家分享,我了解的细节的东西,比如range.js里的每个方法是做什么的
当你选中一段文本后,通过得到selection在通过selection 得到range
这里细说一下range
在ie下range是只有一个,但在除了ie以外的浏览器中range是可以多个的
range有几个比较基本的属性(javascript高级编程这本书介绍过这个但说的有点晕)
startContainer 开始范围的容器
startOffset 开始在范围中的位置
比如哦
<p><b>xxxx[sxxx</b>xxxxx]exxxx</p>
这样一个选区
[]表示我选的位置
我的开始在一个文本的中间,那么我的startContainer就是b下的这个xxxxxxxx的文本节点
那我的startOffset是4因为是从4这个字符开始的
注意有时xxxx 和sxxx是两个节点,虽然我们在页面上看不出来,但在dom树下是有这样的情况的
那么我的startContainer/startoffset就可以变化了
startContainer可以是b 这个节点,startOffset是1
表示是从b下的第一个(就是sxxxx这个)文本节点开始
也可以是startContainer是sxxx这个文本节点,startOffset是0
表示的是sxxxx这个文本节点的第0个字符开始
累死了,不知道我说明白了没
同理endContainer/endOffset也是这个道理
上边的选区的结束是endContainer是p endOffset是2(假设 xxxxx]exxxx 已经是两个节点了,当然也可以是一个,那么就是endContainer是这个文本几点,endOffset是5 注意是选区后面的那个)
collapsed合并,这个书上说的晕死一大堆话
其实就是
xxxxxx|xxxxx这个就是合并
range对象的体现就是
startContainer==endContainer
startOffset == endOffset
好了range得到了,然后交给style,style根据你要加的操作(加粗)来判断你的这个range上的节点是否能发在b/strong里能就从dom树上扣下这些节点放在documentFragment里,然后创建一个b
在appendChild,在插回到dom树上,如果不行,那就从开始的位置上一点一点的细分range,等于是把range切成小块,然后再做上述操作,分别加b
基本的操作就是这样了,好了,这次,是个抛砖头,下次分别聊,跟大家分享,编辑器这个东东,要聊的太多了
分享到:
相关推荐
本篇文章将详细阐述如何在CKEditor 4.0中进行自定义标签操作,并提供经过修改的编辑器JAR包供下载。 CKEditor 4.0是一款开源的JavaScript富文本编辑器,它支持多种浏览器环境,提供丰富的功能和高度可定制性。...
2. **创建编辑器实例**:在JSP页面中,找到你想放置编辑器的地方,使用`<textarea>`标签创建一个文本区域,然后用CKEditor的JavaScript API将其替换为富文本编辑器。例如: ```html <textarea id="myEditor"></...
你也可以通过CKEditor的API获取或设置编辑器的内容,如`CKEDITOR.instances['myEditor'].getData()`用于获取编辑器的当前内容,`CKEDITOR.instances['myEditor'].setData(html)`则用于设置编辑器的内容。 总的来说...
这篇博客文章的作者可能详细讲解了CKEditor的一些高级特性或者特定的使用场景,帮助开发者更好地理解和应用这款编辑器。 首先,CKEditor 5是CKEditor系列的最新版本,它提供了更加现代和用户友好的界面,支持多种...
CKEditor是一款功能丰富的富文本编辑器,常用于网页中的内容编辑。本篇文章将详细介绍如何在SSH框架中整合CKEditor与ExtJS,以实现高效、美观的前端文本编辑功能。 首先,我们需要理解SSH框架的运作原理。Spring...
CKEditor 是一款强大的富文本编辑器,广泛应用于网站内容管理、博客系统和其他在线文本输入场景。它提供了丰富的功能,如格式化、链接插入、图片上传等,极大地提升了用户在网页上的文字编辑体验。本篇文章将重点...
CKEditor,作为一个强大的富文本编辑器,广泛应用于各种在线内容创作平台,包括博客、论坛、CMS系统等。本教程将深入剖析“姜哥手把手教你用ckeditor系列博客第四篇”的源代码,帮助开发者更好地理解和运用CKEditor...
在IT行业中,富文本编辑器CKEditor是一款广泛应用的开源编辑工具,它允许用户在网页上进行格式化的文本编辑。CKFinder则是一个与之配套的文件管理器,方便用户上传、下载和管理图片、文档等资源。这篇博客文章...
CKEditor 是一个强大的富文本编辑器,广泛应用于Web开发中,为用户提供类似Word的文本编辑体验。在ASP.NET框架下,CKEditor可以被整合到网页中,为用户提供在线编辑功能,比如格式化文本、插入图片、创建链接等。这...
CKEditor是一款广泛使用的开源富文本编辑器,它允许用户在网页上进行文本格式化、插入图片、链接等操作,提供了一种与Word类似的编辑体验。`config.js`是CKEditor的核心配置文件,它决定了编辑器的外观和行为。这篇...
本篇文章将深入探讨“WordPress编辑器插件”,特别是针对压缩包中提到的“ckeditor-for-wordpress”。 WordPress的默认编辑器是 Gutenberg,它采用模块化设计,允许用户通过添加区块来构建页面。然而,对于习惯于...
而CKEditor作为一款强大的开源富文本编辑器,被广泛应用于各种Web应用中。对于初学者而言,掌握CKEditor的基本使用及一些高级功能是非常重要的。 #### 二、CKEditor基础介绍 CKEditor是一款基于JavaScript的富文本...
本篇将深入探讨如何在Python的Flask框架中集成富文本编辑器CKEditor,以实现图片、文件及Flash的上传功能。这个项目,名为"flask-ckeditor-demo",提供了一个全面的示例,帮助开发者了解如何在实际应用中使用...
《ckeditor_3.6.zip:富文本编辑器 CKEditor 的深度探索》 CKEditor,一个在Web开发领域广泛使用的开源富文本编辑器,以其强大的功能和易用性赢得了开发者们的青睐。CKEditor 3.6版本是其历史上的一个重要里程碑,...
本篇文章将深入探讨几种常见的编辑器:QQMail编辑器、FCKeditor、新浪编辑器以及Discuz编辑器。 首先,QQMail编辑器是腾讯公司开发的一款用于撰写电子邮件的内置编辑工具。它提供了丰富的文本格式化选项,包括字体...
本篇文章将深入探讨“在线编辑器 .NET 版”的相关知识点,包括其工作原理、开发技术以及实际应用。 1. **在线编辑器概述** 在线编辑器的核心功能是提供一个富文本界面,用户可以通过这个界面输入、格式化文本,...
本篇文章将深入探讨C# HTML编辑器的相关知识点,包括它们的基本功能、设计原理、以及如何在C#项目中集成和扩展这些编辑器。 首先,C# HTML编辑器通常是一种图形用户界面组件,允许用户在应用程序内部创建和编辑HTML...
本篇将深入探讨一款名为“Flash编辑器”的软件,它允许用户在网页上实现类似网页文本编辑器的功能,如文本排版、字体样式设定及颜色调整等。 Flash编辑器的核心在于其强大的ActionScript编程语言,这是Flash开发中...
2. 升级:如果需要升级现有的 CKEditor 安装,首先将旧的编辑器文件夹更名为备份文件夹,然后从 CKEditor 官方网站下载最新版本的 CKEditor,并将下载的文件解压到原编辑器的目录中。最后,将已做过修改的配置文件从...
在 Redmine 中,CKEditor 是一个常用的文本编辑器插件,用于增强用户在创建和编辑问题、注释时的文本格式化能力。CKEditor 提供了一个丰富的富文本界面,使得输入内容时可以添加格式、插入图片、链接等。 这篇博客...