到现在为止专心开发KindEditor积累了一些经验,想和大家分享一下编辑器开发心得,希望越来越多的开发者加入到编辑器开发队伍里。
1. 测试环境
开发基于浏览器的编辑器最痛苦的事情是解决各浏览器的兼容性,刚开始每次添加功能或修改功能IE6到8、Firefox2和3、Safari、Chrome、Opera都测试一遍,后来总结出来经验,只测试IE8、Firefox 3、Chrome,最后发布前再测试其它浏览器。
IE 6、7、8:DOM操作方面基本都一样,UI方面需要注意quirks mode(怪异模式)和strict mode(严格格式),用IE8自带的开发人员工具(按F12就出来)可以修改成怪异模式。
Firefox 2、3:区别还是蛮大的,主要碰到的问题是创建iframe文档的时间点不一样,Firefox 2上创建iframe文档后不能马上操作iframe的DOM,用setTimeout延迟操作就没问题。
Chrome和Safari:因为都用Webkit,Chrome没问题的话Safari也没问题。
Opera:支持可视化最烂,而且每次升级很不稳定,记得10 beta版本根本不能使用9上面正常运行的编辑器。现在支持Opera的原则是能使用就可以,不再研究细节问题了。
2. execCommand和range
开发可视化编辑器最重要的接口是execCommand,现在大多数编辑器或多或少都依赖这个函数,轻量级编辑器绝大多数功能都要依靠它。execCommand最初IE上实现,后来其它浏览器也陆续支持execCommand。execCommand虽然很优秀,但每个浏览器生成不同的HTML代码,很难控制最后输出结果,最新的ckeditor基本完全不用execCommand了。
弥补execCommand缺点的技术是range和selection。range是一个HTML的范围,并提供一些方法来操作HTML范围,比如删除、复制、提取一段HTML。
IE和其它非IE浏览器range接口完全不同,如果range操作比较多的话最好自己写一个统一的类库。IE的range是基于文本和控件的(textRange和controlRange),非IE的range是W3C规范里的range,有开始节点和结束节点的位置,可以精确的操作DOM,下面是W3C range的使用例子。
<p><strong>[粗体</strong>]内容<img src="" /></p>
开始节点:textNode - 粗体
开始位置:0
结束节点:textNode - 内容
结束位置:0
<p><strong>粗体</strong>内容[<img src="" />]</p>
开始节点:textNode - 内容
开始位置:2
结束节点:p node (因为img node后面没有textNode,所以只能用父节点的子节点位置来描述。)
结束位置:3
3. 后退/撤销
开发编辑器还有一个要解决的问题是undo/redo,在IE上iframe的undo记录和外部document的undo记录是在一起的,任何一个对外部document的变更会失去undo记录。
目前KindEditor用最原始的全文保存方法,每次修改内容时把html保存到一个数组里,这么做代码非常简单,但无法保存选中状态,我目前还没找到合适的解决方案。
4. 删除格式
execCommand有一个removeformat命令,这个命令在IE上有一个缺陷,就是不能删除span。要解决这个问题只能自己实现这个功能,原理是先切割选中范围的开始节点和结束节点,然后遍历node删除中间的样式标签。
5. URL格式
在IE上相对路径自动变成包括域名的绝对路径,如果用户需要将测试环境的数据导入到正式环境就有问题了。解决方法是根据location.host正则匹配重新修改成相对路径。
2009-12-23补充:更好的方法是把URL保存在自定义属性里,比如<img my_src="test.gif" src="test.gif" />,最后输出时用my_src重置src,这样可以做到输入什么显示什么的效果。
分享到:
相关推荐
【描述】:“js版的”说明这个编辑器是基于JavaScript编程语言实现的,JavaScript是一种广泛应用于客户端Web开发的脚本语言,用于处理网页的动态内容、控制用户界面交互以及实现各种功能。 【标签】:“js 在线编辑...
在本JAVA课程设计中,学生通过构建一个计算器与文本编辑器的应用程序,深入理解了Java编程语言的基础知识和GUI设计原则。这篇报告主要涵盖了计算器应用的实现过程,包括功能需求分析、设计思路、类划分以及具体实现...
在工具使用上,不能过度依赖如Dreamweaver这样的可视化编辑器,而是要注重理解代码,这样才能真正提升技能。我学会了阅读和编写代码,这是网站开发的核心。在选择开源系统时,如帝国CMS、动易、新云、JTBC、...
ResourceView提供了对资源的可视化编辑,如创建和修改菜单。而FileView则帮助开发者管理和浏览项目中的源代码和资源文件。 通过深入学习和实践,开发者不仅可以熟练掌握VC++6.0的集成开发环境,还能运用各种工具...
1. 集成可视化代码编辑界面,用户可以通过其界面直接编写C、汇编、.cmd文件等。 2. 含有集成代码生成工具,包括汇编器、优化C编译器、链接器等,将代码的编辑、编译、链接和调试等诸多功能集成到一个软件环境中。 3....
Unity3D是一款强大的跨平台游戏引擎,广泛应用于2D和3D游戏开发、建筑可视化、实时动画等。掌握Unity3D的基础概念是进行游戏开发的前提。 - **场景(Scene)**: 类似于Flash中的场景,是用户最终看到的内容。所有的...
您可以使用任何文本编辑器(如Visual Studio Code、Sublime Text等)来编写MongoDB相关的实验代码。确保您的代码清晰易读,并注释关键步骤。 **2. 准备报告文档** 报告文档应该包括实验的目的、步骤、结果和结论,...
Delphi以其高效的编译器、直观的可视化组件库和快速的应用程序开发(RAD)理念闻名于世。 在学习Delphi的过程中,首先需要理解的是它的集成开发环境(IDE)。Delphi的IDE提供了一个统一的工作空间,集成了代码编辑...
11. 数据库编辑器:可以查看可用节点列表,导出数据库至Excel编辑,并设定不同类型的块,如AI、AR、DR、CA、ETR、EV、PG和RA块,以满足各种数据处理需求。 12. 数据域:例如F_CV表示浮点型数据的当前值,是IFIX中...
上机实验是编程学习的关键环节,它帮助我们掌握C语言的开发环境,例如GCC编译器、文本编辑器等。通过不断的编写、编译、运行和调试程序,我们能更好地理解语法规定,提高程序开发效率。此外,上机实验还能培养我们...
例如,通过编写脚本,可以实现与PLC的双向通信,读取生产数据,根据预设条件触发控制逻辑,同时将数据可视化展示在HMI界面上。 6. **学习资源与社区支持**: 昆仑通态公司提供了详细的文档和在线教程,帮助用户...
它提供了丰富的API和功能,使得开发者能够轻松地在Web浏览器中构建复杂的图形编辑器和流程图工具。这款库以其灵活性、性能和易用性著称,广泛应用于数据可视化、流程设计、UI设计等领域。 在mxGraph中,你可以创建...
Unity 是一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具。其编写的程序可以发布游戏至 Windows、Mac、Wii、iPhone、WebGL(需要 HTML5)、Windows Phone ...
在学习MATLAB的过程中,通常会从基础开始,例如了解MATLAB的开发环境,包括命令行窗口、工作空间、编辑器等。然后,学习基本的数据类型,如字符型、数值型(包括单精度和双精度)、元胞型、结构体型等。此外,还会...
Gef,全称为 Graph Editor Framework,是一个强大的图形编辑框架,主要用于构建可视化的图形编辑工具。在IT行业中,Gef通常与EMF(Eclipse Modeling Framework)结合使用,用于创建复杂的建模和设计环境。由于官方...
此外,Flare3D 提供了可视化编辑工具,允许开发者直观地编辑场景和模型,调整贴图,以及设置光照、骨骼和摄像机系统,这些工具对于提高开发效率非常有帮助。 然而,Flare3D 也有一些不足之处。尽管它提供了许多功能...
MATLAB由美国MathWorks公司开发,提供了一个集数值分析、图形可视化和交互式编程于一体的平台,被公认为当今国际科学计算软件的领导者。 在通信工程领域,MATLAB的重要性不言而喻。它不仅用于基本的数值计算和符号...
这个文件包含了所有Playmaker的组件和脚本,用户导入后即可在Unity编辑器中看到Playmaker的工作面板,并开始创建自己的游戏逻辑。 总的来说,Playmaker 1.9是Unity开发中的一个重要辅助工具,通过其可视化的工作...
- 可视化模式:按`v`键进入,用于选择文本区域。 - **保存退出**:在命令模式下输入`wq`保存并退出编辑器。 ##### gdb调试 - **安装gdb**:Linux系统通常自带`gdb`调试工具,无需额外安装。 - **进入gdb调试状态...
- **Xcode**:作为Apple提供的集成开发环境,Xcode集成了代码编辑器、调试器、模拟器等功能于一体,是iOS开发不可或缺的工具。 - **iOS SDK**:包含了开发iOS应用所需的各种库和工具,如Cocoa Touch框架。 ##### ...