`
luolonghao
  • 浏览: 119164 次
  • 性别: Icon_minigender_1
  • 来自: Shanghai
社区版块
存档分类
最新评论

可视化编辑器的开发心得

阅读更多
到现在为止专心开发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,这样可以做到输入什么显示什么的效果。
分享到:
评论
23 楼 cuixiping 2010-05-26  
我也在造这个重复的轮子,公司的产品里面用到。
如果只有IE8+,Firefox3+,我可以多活十年。
中国特色的是,IE6很多,腾讯TT很多,遨游很多,GreeBrowser很多,弄得我超级郁闷。
比如说腾讯TT,编辑器插入图片,总会插入到最前面,似乎是记不住焦点的位置,用CKEditor在TT下也是有这个BUG。还有遨游等,虽然是IE内核,但对某些事件模型的处理与IE有别,导致一些事件甚至无法捕获,苦不堪言。熟料公司偏偏非让我去实现,因为客户是上帝,程序员是草芥。
22 楼 hfzhangchain 2010-04-07  
kindeditor跨域跨域上传图片么?
21 楼 luolonghao 2009-12-28  
vb2005xu 写道
谢谢楼主的回付,不过你这段代码并没有问题啊,我使用的ff也是2.0,见下图

可能这端代码太简单了。我遇到的情况是感觉iframe的DOM还没创建完,逼我使用setTimeout
20 楼 playfish 2009-12-28  

我觉得在处理兼容性问题上,楼主可以参考yahoo的策略,给浏览器进行分级来适应。什么级别的浏览器必须达到一个什么程度的适应性。

关于chrome,opera,firefox,我觉得低版本的这些浏览器是可以极大降级的。一般使用这些浏览器的用户,在软件发布新版本的时候都会很快就更新到新版本,尤其(chrome)。不像IE6。。领了风骚十几年。。firefox2我也认为是可以放弃的用户。

为了3%的用户投入50%的精力,不值得。。
19 楼 vb2005xu 2009-12-28  
谢谢楼主的回付,不过你这段代码并没有问题啊,我使用的ff也是2.0,见下图
18 楼 luolonghao 2009-12-23  
vb2005xu 写道
请教lz一个问题啊: 你说. Firefox 2上创建iframe文档后不能马上操作iframe的DOM ,是指什么意思呢?

我这段代码真没解释呢?
build_ifr: function(){
var eo_ifr = xu.dom.EObject.create('iframe');
eo_ifr.appendTo($TagN('body')[0]);
eo_ifr.attr({id: this.panel}).css({'border': 0,'width': 0,'height': 0,'display':'none'});
}

我碰到的问题是:

var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
var iframeWin = iframe.contentWindow;
var iframeDoc = iframe.contentDocument || iframe.contentWindow.document;
iframeDoc.designMode = "On";
iframeDoc.open();
iframeDoc.write('<html><head><title>aa</title></head><body></body></html>');
iframeDoc.close();
iframeDoc.body.innerHTML = 'aaa'; //在Firefox 2上这里报错
17 楼 vb2005xu 2009-12-23  
请教lz一个问题啊: 你说. Firefox 2上创建iframe文档后不能马上操作iframe的DOM ,是指什么意思呢?

我这段代码真没解释呢?
build_ifr: function(){
var eo_ifr = xu.dom.EObject.create('iframe');
eo_ifr.appendTo($TagN('body')[0]);
eo_ifr.attr({id: this.panel}).css({'border': 0,'width': 0,'height': 0,'display':'none'});
}
16 楼 luolonghao 2009-12-23  
night_stalker 写道
Opera 的 textarea 设为不可编辑时,不显示光标和选区并且不能用方向键 ……
而且 selection range 的字符计数不一样 ……

Opera太难对应了 ... ...
15 楼 night_stalker 2009-12-22  
Opera 的 textarea 设为不可编辑时,不显示光标和选区并且不能用方向键 ……
而且 selection range 的字符计数不一样 ……
14 楼 luolonghao 2009-12-21  
moyue 写道
如果要做不同浏览器不同js代码,检测最好用对象检测,不要用浏览器检测,这样更准确。

不用浏览器检测要看情况的,主要是Opera,记得有好几个IE的接口。
13 楼 moyue 2009-12-21  
如果要做不同浏览器不同js代码,检测最好用对象检测,不要用浏览器检测,这样更准确。
12 楼 luolonghao 2009-12-21  
Army 写道
正则主要格式化什么东西?

取得HTML用innerHTML取得的,出来的HTML不符合XHTML标准。当然对最后输出结果没什么要求的话直接用也可以,难看是难看了点。
11 楼 Army 2009-12-21  
正则主要格式化什么东西?
10 楼 luolonghao 2009-12-21  
Army 写道
听上去似乎有点像jindw说的“局部刷新”,根据操作重新生成这一块儿的html。

那么性能如何呢?尤其在富文本量过大的情况?

大部分情况下基本都对选中范围进行操作,修改HTML性能不会有问题的。最后输出HTML得用正则格式化,这里有一些性能瓶颈,但一般大小的页面基本没问题。
9 楼 Army 2009-12-21  
听上去似乎有点像jindw说的“局部刷新”,根据操作重新生成这一块儿的html。

那么性能如何呢?尤其在富文本量过大的情况?
8 楼 luolonghao 2009-12-21  
因为在iframe里的文档也是document,和普通的document操作一样,用range,node就可以修改任何HTML。
7 楼 Army 2009-12-21  
引用
最新的ckeditor基本完全不用execCommand了


那么它是用什么?
6 楼 風一樣的男子 2009-12-21  
嗯,这个不错,google 的就是这样搞的
5 楼 southgate 2009-12-21  
可不可以把js做成for IE ,for FF....不同的浏览器不同的包呢
用后台判断出到底是什么类型的浏览器,再进行加载
这样可以减少js大小,把罗里罗嗦的判断代码去掉
4 楼 jejwe 2009-12-21  
KindEditor要是支持table的自定义就好了。这样可以做自定义表单了。之前扩展了KindEditor。推荐给公司的OA组用做编辑器。最后他们换了FCK。主要是因为在COPY WORD内容时速度非常慢

相关推荐

    网易qq 新浪编辑器

    【描述】:“js版的”说明这个编辑器是基于JavaScript编程语言实现的,JavaScript是一种广泛应用于客户端Web开发的脚本语言,用于处理网页的动态内容、控制用户界面交互以及实现各种功能。 【标签】:“js 在线编辑...

    JAVA课程设计报告-心得体会——计算器、文本编辑器.pdf

    在本JAVA课程设计中,学生通过构建一个计算器与文本编辑器的应用程序,深入理解了Java编程语言的基础知识和GUI设计原则。这篇报告主要涵盖了计算器应用的实现过程,包括功能需求分析、设计思路、类划分以及具体实现...

    网站开发心得体会.doc

    在工具使用上,不能过度依赖如Dreamweaver这样的可视化编辑器,而是要注重理解代码,这样才能真正提升技能。我学会了阅读和编写代码,这是网站开发的核心。在选择开源系统时,如帝国CMS、动易、新云、JTBC、...

    VC++6.0开发环境学习指导手册

    ResourceView提供了对资源的可视化编辑,如创建和修改菜单。而FileView则帮助开发者管理和浏览项目中的源代码和资源文件。 通过深入学习和实践,开发者不仅可以熟练掌握VC++6.0的集成开发环境,还能运用各种工具...

    关于DSP集成开发环境CCS的学习总结.doc

    1. 集成可视化代码编辑界面,用户可以通过其界面直接编写C、汇编、.cmd文件等。 2. 含有集成代码生成工具,包括汇编器、优化C编译器、链接器等,将代码的编辑、编译、链接和调试等诸多功能集成到一个软件环境中。 3....

    Unity3d心得

    Unity3D是一款强大的跨平台游戏引擎,广泛应用于2D和3D游戏开发、建筑可视化、实时动画等。掌握Unity3D的基础概念是进行游戏开发的前提。 - **场景(Scene)**: 类似于Flash中的场景,是用户最终看到的内容。所有的...

    MongoDB的Linux安装、基本操作、可视化、实验源码与报告文档.docx

    您可以使用任何文本编辑器(如Visual Studio Code、Sublime Text等)来编写MongoDB相关的实验代码。确保您的代码清晰易读,并注释关键步骤。 **2. 准备报告文档** 报告文档应该包括实验的目的、步骤、结果和结论,...

    关于delphi 心得

    Delphi以其高效的编译器、直观的可视化组件库和快速的应用程序开发(RAD)理念闻名于世。 在学习Delphi的过程中,首先需要理解的是它的集成开发环境(IDE)。Delphi的IDE提供了一个统一的工作空间,集成了代码编辑...

    ifix学习心得.doc

    11. 数据库编辑器:可以查看可用节点列表,导出数据库至Excel编辑,并设定不同类型的块,如AI、AR、DR、CA、ETR、EV、PG和RA块,以满足各种数据处理需求。 12. 数据域:例如F_CV表示浮点型数据的当前值,是IFIX中...

    c语言编程实习心得.doc

    上机实验是编程学习的关键环节,它帮助我们掌握C语言的开发环境,例如GCC编译器、文本编辑器等。通过不断的编写、编译、运行和调试程序,我们能更好地理解语法规定,提高程序开发效率。此外,上机实验还能培养我们...

    Matlab学习心得与体会.pdf

    在学习MATLAB的过程中,通常会从基础开始,例如了解MATLAB的开发环境,包括命令行窗口、工作空间、编辑器等。然后,学习基本的数据类型,如字符型、数值型(包括单精度和双精度)、元胞型、结构体型等。此外,还会...

    Gef 学习总结

    Gef,全称为 Graph Editor Framework,是一个强大的图形编辑框架,主要用于构建可视化的图形编辑工具。在IT行业中,Gef通常与EMF(Eclipse Modeling Framework)结合使用,用于创建复杂的建模和设计环境。由于官方...

    mcgs脚本驱动工具

    例如,通过编写脚本,可以实现与PLC的双向通信,读取生产数据,根据预设条件触发控制逻辑,同时将数据可视化展示在HMI界面上。 6. **学习资源与社区支持**: 昆仑通态公司提供了详细的文档和在线教程,帮助用户...

    flare3D引擎使用心得

    此外,Flare3D 提供了可视化编辑工具,允许开发者直观地编辑场景和模型,调整贴图,以及设置光照、骨骼和摄像机系统,这些工具对于提高开发效率非常有帮助。 然而,Flare3D 也有一些不足之处。尽管它提供了许多功能...

    MATLAB学习心得(20211029220901).pdf

    MATLAB由美国MathWorks公司开发,提供了一个集数值分析、图形可视化和交互式编程于一体的平台,被公认为当今国际科学计算软件的领导者。 在通信工程领域,MATLAB的重要性不言而喻。它不仅用于基本的数值计算和符号...

    案例分析1

    Unity 是一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具。其编写的程序可以发布游戏至 Windows、Mac、Wii、iPhone、WebGL(需要 HTML5)、Windows Phone ...

    Playmaker190.zip

    这个文件包含了所有Playmaker的组件和脚本,用户导入后即可在Unity编辑器中看到Playmaker的工作面板,并开始创建自己的游戏逻辑。 总的来说,Playmaker 1.9是Unity开发中的一个重要辅助工具,通过其可视化的工作...

    操作系统实验报告-Linux下C语言使用、编译与调试实验

    - 可视化模式:按`v`键进入,用于选择文本区域。 - **保存退出**:在命令模式下输入`wq`保存并退出编辑器。 ##### gdb调试 - **安装gdb**:Linux系统通常自带`gdb`调试工具,无需额外安装。 - **进入gdb调试状态...

    iOS开发:从入门到精通的指南.docx

    - **Xcode**:作为Apple提供的集成开发环境,Xcode集成了代码编辑器、调试器、模拟器等功能于一体,是iOS开发不可或缺的工具。 - **iOS SDK**:包含了开发iOS应用所需的各种库和工具,如Cocoa Touch框架。 ##### ...

    PHP课程设计报告.doc

    系统运行环境为Windows 7操作系统,开发工具为Dreamweaver 8和phpstudy,这表明开发过程将结合可视化编辑器与服务器端脚本环境。 在系统分析与设计章节,需求分析强调了系统需具备管理员对学生信息的增删查改功能,...

Global site tag (gtag.js) - Google Analytics