在线编辑器的基本实现原理

简介:       如今网站开发越来越提倡用户体验,为用户提供便利的工具也越来越多,而在线的HTML内容编辑器应该算是其中比较“古老”的一个了。功能简单的可以为用户提供文本的样式控制,例如文字的颜色、字体大小等;而功能复杂的甚至可以提供类似Word一样的强大功能。

      如今网站开发越来越提倡用户体验,为用户提供便利的工具也越来越多,而在线的HTML内容编辑器应该算是其中比较“古老”的一个了。功能简单的可以为用户提供文本的样式控制,例如文字的颜色、字体大小等;而功能复杂的甚至可以提供类似Word一样的强大功能。虽然现在各种开源的编辑器非常多,但是真正好用的并不多,所以它们改进工作也一直在进行中。

       如今网上多数的编辑器都有很强大的功能,相对而言,在使用中也需要很多的配置,当然代码也自然会比较“臃肿”。如果我们并不需要功能那么强大的编辑器,那么可以自己实现一个,因为代码并不复杂。下面是一点个人的经验,仅供参考(以ExtJS的HTMLEditor为例)。

      1、初始化。当页面加载完毕后,向页面添加一个IFrame(可选)。这里要注意的是,要判断页面的状态,要等页面完全加载完毕后再进行操作,防止出现找不到某些元素的错误。

      2、打开编辑功能。将IFrame设为可以编辑(下面代码来自ExtJS的HTMLEditor):

      // 获取iframe的window对象 getWin : function(){ return Ext.isIE ? this.iframe.contentWindow : window.frames[this.iframe.name]; }, //获取iframe的document对象 getDoc : function(){ return Ext.isIE ? this.getWin().document : (this.iframe.contentDocument || this.getWin().document); }, //打开document对象,向其写入初始化内容,以兼容FireFox doc = this.getDoc(); doc.open(); doc.write('<html><head><mce:style type="text/css"><!-- body{border:0;margin:0;padding:3px;height:98%;cursor:text;} --></mce:style><style type="text/css" mce_bogus="1">body{border:0;margin:0;padding:3px;height:98%;cursor:text;}</style></head><body></body></html>'); //打开document对象编辑模式 doc.designMode = "on"; doc.close();

      这样就可以向这个简单那的编辑器中写入内容了。

 

      3、获取编辑器的内容,代码如下:

      //获取编辑器的body对象 var body = doc.body || doc.documentElement; //获取编辑器的内容 var content = body.innerHTML; //对内容进行处理,例如替换其中的某些特殊字符等等 //Some code //返回内容 return content;

 

      4、增加样式设置。上面的编辑器虽然实现了基本功能,但是实在是有些太简单了,应该增加些简单的样式实现。document的execCommand方法使这种想法成为可能。

     //统一的执行命令方法 function execCmd(cmd, value){ //doc对象的获取参照上面的代码 //调用execCommand方法执行命令 doc.execCommand(cmd, false, value === undefined ? null : value); }; //将选中字体变为黑体,Ctrl-B execCmd('bold'); //加下划线,Ctrl-U execCmd('underline'); //变为斜体,Ctrl-I execCmd('italic'); //设置文字的颜色 execCmd('forecolor', Ext.isSafari || Ext.isIE ? '#'+color : color); //在光标处插入一段内容 function insertAtCursor(text){ //win对象的获取参考上面的代码 if(Ext.isIE){ win.focus(); var r = doc.selection.createRange(); if(r){ r.collapse(true); r.pasteHTML(text); } }else if(Ext.isGecko || Ext.isOpera){ win.focus(); execCmd('InsertHTML', text); }else if(Ext.isSafari){ execCmd('InsertText', text); } }

 

     5、再进一步。如今可以改变样式了,如果编辑器有工具栏(这应该是必然的),那么我们还想工具栏上的按钮根据光标所处位置的样式,自动处于突出或正常显示。document的queryCommandState()方法又让这种想法得以实现。

     //doc对象的获取参考上面的对面 //光标处是否是粗体 var isBold = doc.queryCommandState('bold'); if(isBold){ //改变Bold按钮的样式 } //当然上面的代码是可以合并的,这里只不过是一个示意 //下划线 doc.queryCommandState('underline'); //斜体 doc.queryCommandState('italic');

 

     本文只是为实现编辑器提供了简单的思路,其中的一些代码是可以直接使用的。建议,想自己实现编辑器的朋友可以参考下ExtJS中的HTMLEditor代码,既简单又比较清晰,可以在其上进行扩展。

     最后提醒一点:一定要注意浏览器的兼容性问题,并且不要等接近尾声了再去测试兼容性,对于这么大量的JavaScript代码,调整是比较痛苦的事情。

     

     

目录
相关文章
|
关系型数据库 Shell Linux
|
2月前
|
新能源
大盘择时:慎用固定均线!12年回测A股数据揭示择时策略的3大适应性缺陷
动量策略加入50日与200日均线择时后收益下降,主要因均线滞后、逻辑冲突及市场变化。解决方案包括动态调整择时参数、结合多指标验证、优化动量执行细节,提升策略适应性与收益表现。
|
9月前
|
人工智能 数据挖掘 API
淘宝评论与商品详情数据API接口的使用与应用
商品详情数据API:获取商品的基本信息(如标题、价格、库存、描述等)。 评论数据API:获取商品的用户评价数据(如评分、评论内容、用户昵称、购买时间等)。
|
存储 Linux 调度
OpenStack如何支持虚拟化技术?
【8月更文挑战第21天】
785 0
|
11月前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
1086 15
|
缓存 JavaScript 前端开发
【Vue面试题七】、SPA (单页面) 首屏加载速度慢怎么解决?
这篇文章探讨了单页面应用(SPA)首屏加载速度慢的问题,并提供了多种解决方案,包括减小入口文件体积、静态资源本地缓存、UI框架按需加载、图片资源压缩、组件重复打包、开启GZip压缩和使用服务端渲染(SSR),以优化资源加载和页面渲染,改善用户体验。
【Vue面试题七】、SPA (单页面) 首屏加载速度慢怎么解决?
|
Java 程序员 语音技术
怎么用Java 把多个音频拼接成一个?
**Java音频拼接指南** 在Java中,利用音频处理库`cn.juwatech.*`可合并音频文件。步骤包括导入库,创建`AudioFile`对象,将它们添加到列表,然后用`AudioConcatenator.concat()`拼接成一个文件。注意确保音频格式一致,处理异常,并考虑性能优化。此技术提升用户体验,适用于音频编辑和合成场景。[来源:稀土掘金](https://juejin.cn/post/7387701265797840932)
494 0
|
NoSQL 测试技术 Redis
Redis【性能 01】Redis 5.x 6.x 7.x 共5个不同版本延迟及性能测试对比分析(单机版默认配置)
Redis【性能 01】Redis 5.x 6.x 7.x 共5个不同版本延迟及性能测试对比分析(单机版默认配置)
807 0
|
存储 Linux 程序员
x86的内存寻址方式
在16位的8086时代,CPU为了能寻址超过16位地址能表示的最大空间(因为 8086 的地址线 20 位而数据线 16 位),引入了段寄存器。通过将内存空间划分为若干个段(段寄存器像 ds、cs、ss 这些寄存器用于存放段基址),然后采用段基地址+段内偏移的方式访问内存,这样能访问1MB的内存空间了。
|
数据库 关系型数据库 MySQL
Xtrabackup流备份,增量和压缩小结
【问题背景】 1、  针对MySQL文件比较大,需要压缩的数据库。 如500G数据库,xtrabackup备份后文件为500G,备份完成后再压缩打包,相当于文件读写3次。
1681 0

热门文章

最新文章