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

 更新时间:2015年04月25日 09:45:56   投稿:junjie  
这篇文章主要介绍了在线所见即所得HTML编辑器的实现原理浅析,本文用初始化、打开编辑功能、获取编辑器的内容、增加样式设置、再进一步等步骤阐述在线编辑器的基本实现原理,需要的朋友可以参考下

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

相关文章

  • String.prototype实现的一些javascript函数介绍

    String.prototype实现的一些javascript函数介绍

    这篇文章主要是对String.prototype实现的一些javascript函数进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-11-11
  • 关于Stream和Buffer的相互转换详解

    关于Stream和Buffer的相互转换详解

    这篇文章主要给大家介绍了关于Stream和Buffer相互转换的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧。
    2017-07-07
  • nuxt中使用路由守卫的方法步骤

    nuxt中使用路由守卫的方法步骤

    这篇文章主要介绍了nuxt中使用路由守卫的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • 浅谈ES6新增的数组方法和对象

    浅谈ES6新增的数组方法和对象

    下面小编就为大家带来一篇浅谈ES6新增的数组方法和对象。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • JavaScript实现购物车基本功能

    JavaScript实现购物车基本功能

    这篇文章主要为大家详细介绍了JavaScript实现购物车的基本功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • JavaScript 数组遍历的五种方法

    JavaScript 数组遍历的五种方法

    这篇文章主要介绍了JavaScript 数组遍历的五种方法,帮助大家更好的理解和学习使用JavaScript,感兴趣的朋友可以了解下
    2021-03-03
  • ie7+背景透明文字不透明超级简单的实现方法

    ie7+背景透明文字不透明超级简单的实现方法

    这篇文章主要介绍了ie7+背景透明文字不透明超级简单的实现方法,有需要的朋友可以参考一下
    2014-01-01
  • JS实现表单全选以及取消全选实例

    JS实现表单全选以及取消全选实例

    这篇文章主要为大家详细介绍了JS实现表单全选以及取消全选实例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 微信小程序实现保存图片到相册功能

    微信小程序实现保存图片到相册功能

    项目中有个保存二维码到相册的功能,所以涉及到用户是否授权相册权限的问题。这篇文章主要介绍了微信小程序实现保存图片到相册功能,需要的朋友可以参考下
    2018-11-11
  • Selenium执行JavaScript脚本的方法示例

    Selenium执行JavaScript脚本的方法示例

    这篇文章主要介绍了Selenium执行JavaScript脚本的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12

最新评论