在线所见即所得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 相关文章推荐
js 日期转换成中文格式的函数
Jul 07 Javascript
JavaScript OOP类与继承
Nov 15 Javascript
基于jQuery的message插件实现右下角弹出消息框
Jan 11 Javascript
移动设备web开发首选框架:zeptojs介绍
Jan 29 Javascript
jQuery hover事件简单实现同时绑定2个方法
Jun 07 Javascript
jQuery插件HighCharts绘制的基本折线图效果示例【附demo源码下载】
Mar 07 Javascript
jQuery实现注册会员时密码强度提示信息功能示例
Sep 05 jQuery
微信小程序实现下拉菜单切换效果
Mar 30 Javascript
layui实现数据分页功能(ajax异步)
Jul 27 Javascript
浅谈bootstrap layer.open中end的使用方法
Sep 12 Javascript
浅析Vue 中的 render 函数
Feb 28 Javascript
vue实现登录功能
Dec 31 Vue.js
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
模仿OSO的论坛(四)
2006/10/09 PHP
yii操作cookie实例简介
2014/07/09 PHP
PHP简单的MVC框架实现方法
2015/12/01 PHP
thinkphp3.2嵌入百度编辑器ueditor的实例代码
2017/07/13 PHP
PHP后门隐藏的一些技巧总结
2020/11/04 PHP
javascript实现unicode和字符的互相转换
2007/07/18 Javascript
JavaScript 全角转半角部分
2009/10/28 Javascript
php gethostbyname获取域名ip地址函数详解
2010/01/24 Javascript
Javascript表达式中连续的 &amp;&amp; 和 || 之赋值区别
2010/10/17 Javascript
js移除事件 js绑定事件实例应用
2012/11/28 Javascript
javascript中文本框中输入法切换的问题
2013/12/10 Javascript
Js实现双击鼠标自动滚动屏幕的示例代码
2013/12/14 Javascript
jquery 淡入淡出效果的简单实现
2014/02/07 Javascript
javascript实现动态表头及表列的展现方法
2015/07/14 Javascript
如何利用JQuery实现从底部回到顶部的功能
2016/12/27 Javascript
5种JavaScript脚本加载的方式
2017/01/16 Javascript
Vue.js 2.0中select级联下拉框实例
2017/03/06 Javascript
NodeJS实现图片上传代码(Express)
2017/06/30 NodeJs
使用Electron构建React+Webpack桌面应用的方法
2017/12/15 Javascript
10分钟上手vue-cli 3.0 入门介绍
2018/04/04 Javascript
详解如何在nuxt中添加proxyTable代理
2018/08/10 Javascript
jQuery实现基本隐藏与显示效果的方法详解
2018/09/05 jQuery
javascript前端实现多视频上传
2020/12/13 Javascript
示例详解Python3 or Python2 两者之间的差异
2018/08/23 Python
浅谈Python中的bs4基础
2018/10/21 Python
python模拟鼠标点击和键盘输入的操作
2019/08/04 Python
Pycharm和Idea支持的vim插件的方法
2020/02/21 Python
python zip,lambda,map函数代码实例
2020/04/04 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
2020/07/09 Python
南威尔士家居商店:Leekes
2016/10/25 全球购物
美国猫狗药物和用品网站:PetCareRx
2017/01/05 全球购物
行政管理毕业生自荐信
2014/02/24 职场文书
高三学生评语大全
2014/04/25 职场文书
邀请函模板
2015/02/02 职场文书
高中同学会致辞
2015/08/01 职场文书
Python数据可视化之绘制柱状图和条形图
2021/05/25 Python