在线所见即所得HTML编辑器的实现原理浅析


Posted in Javascript onApril 25, 2015

如今网站开发越来越提倡用户体验,为用户提供便利的工具也越来越多,而在线的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代码,调整是比较痛苦的事情。

Javascript 相关文章推荐
Mootools 1.2教程 滑动效果(Slide)
Sep 15 Javascript
javascript eval(func())使用示例
Dec 05 Javascript
简单的代码实现jquery定时器
Jan 03 Javascript
js实现的点击数量加一可操作数据库
May 09 Javascript
node.js中的buffer.copy方法使用说明
Dec 14 Javascript
ionic进入多级目录后隐藏底部导航栏(tabs)的完美解决方案
Nov 23 Javascript
浅析Ajax语法
Dec 05 Javascript
详解vue-cli构建项目反向代理配置
Sep 07 Javascript
详解ES6中的三种异步解决方案
Jun 28 Javascript
微信小程序实现星级评价
Nov 20 Javascript
Vue3.0写自定义指令的简单步骤记录
Jun 27 Vue.js
JS前端可视化canvas动画原理及其推导实现
Aug 05 Javascript
JavaScript在Android的WebView中parseInt函数转换不正确问题解决方法
Apr 25 #Javascript
Node.js和MongoDB实现简单日志分析系统
Apr 25 #Javascript
node.js操作mongodb学习小结
Apr 25 #Javascript
JavaScript按值删除数组元素的方法
Apr 24 #Javascript
JavaScript获取一个范围内日期的方法
Apr 24 #Javascript
jQuery中next方法用法实例
Apr 24 #Javascript
JavaScript实现多个重叠层点击切换效果的方法
Apr 24 #Javascript
You might like
php 格式化数字的时候注意数字的范围
2010/04/13 PHP
小文件php+SQLite存储方案
2010/09/04 PHP
用PHP实现的四则运算表达式计算实现代码
2011/08/02 PHP
PHP读取PPT文件的方法
2015/12/10 PHP
理解PHP中的Session及对Session有效期的控制
2016/01/08 PHP
PHP实现对图片的反色处理功能【测试可用】
2018/02/01 PHP
收藏一些不常用,但是有用的代码
2007/03/12 Javascript
读jQuery之十二 删除事件核心方法
2011/07/31 Javascript
基于jquery的文本框与autocomplete结合使用(asp.net+json)
2012/05/30 Javascript
IE下JS读取xml文件示例代码
2013/08/05 Javascript
jQuery实现简单的日期输入格式化控件
2015/03/12 Javascript
jQuery选择id属性带有点符号元素的方法
2015/03/17 Javascript
JavaScript代码生成PDF文件的方法
2016/02/26 Javascript
JS留言功能的简单实现案例(推荐)
2016/06/23 Javascript
AngularJS中update两次出现$promise属性无法识别的解决方法
2017/01/05 Javascript
JS正则表达式验证中文字符
2017/05/08 Javascript
React Navigation 使用中遇到的问题小结
2018/05/08 Javascript
微信小程序上传图片实例
2018/05/28 Javascript
JSX在render函数中的应用详解
2019/09/04 Javascript
layui给下拉框、按钮状态、时间赋初始值的方法
2019/09/10 Javascript
JS Web Flex弹性盒子模型代码实例
2020/03/10 Javascript
Python中使用Boolean操作符做真值测试实例
2015/01/30 Python
python 叠加等边三角形的绘制的实现
2019/08/14 Python
彻底搞懂 python 中文乱码问题(深入分析)
2020/02/28 Python
Python库skimage绘制二值图像代码实例
2020/04/10 Python
Python 列表反转显示的四种方法
2020/11/16 Python
CSS3 Backgrounds属性相关介绍
2011/05/11 HTML / CSS
Myprotein瑞士官方网站:运动营养和健身网上商店
2019/09/25 全球购物
意大利香水和化妆品购物网站:Parfimo.it
2019/10/06 全球购物
国际经济贸易专业推荐信
2013/11/06 职场文书
人力资源主管岗位职责
2014/01/29 职场文书
安康杯竞赛活动总结
2014/05/05 职场文书
银行竞聘报告范文
2014/11/06 职场文书
告知书格式
2015/07/01 职场文书
2015年物业管理员工工作总结
2015/10/15 职场文书
2021年国产动漫公司排行前十名,玄机科技上榜,第二推出过铠甲勇士
2022/03/18 杂记