原生html编辑器,原生富文本编辑器

前言

前不久面某厂,负责人所在部门是做在线文档的,最后几个提问都是围绕离线存储和富文本编辑相关问题,在这块有点懵,之前没有接触过富文本编辑器原理,在页面光标能在文本之间随意选择,删除和输入,一直以为是一种hack技术,原来页面本身有的一个属性,配合实现还有js的方法和属性。在这简单记录一下。

实现原理

实现富文本效果有两种方法:1. iframe+designMode,2. contenteditable。

方法一:iframe+designMode

页面中iframe嵌入一个子页面,把iframe的属性designMode设为on,这个子页面的所有内容就可以想使用文字处理软件一样,对文本进行加粗、斜体等设置。

主页面

富文本编辑

window.addEventListener('load', function () {

window.frames['richedit'].document.designMode = 'on';

}, false);

content.html子页面

Document

富文本编辑器标题

导航栏

内容区块

这里是一些内容,这里是一些内容,这里是一些内容

底部版权相关申明

实现效果

1460000015148704?w=422&h=320

方法二:contenteditable

可以把contenteditable属性应用到页面中的任何元素,然后用户立即就可以编辑该元素,而不需要iframe页。

标题栏

导航栏

内容主体部分

$richedit = document.getElementById('richedit');

$richedit.contentEditable = 'true';

实现效果

1460000015148705?w=334&h=133

操作富文本

只展示富文本的效果意义不大,实际应用中,更多结合用户操作交互,产生想要的效果,js中已提供相应api。

document.execCommand()

document.execCommand()对文档执行预定义的命令,而且可以应用大多数格式。可以传递3个参数:要执行命令的名称、浏览器是否为命令提供用户界面的一个布尔值和执行命令必须的值(无需则为null)。

设置粗体document.execCommand('bold', false, null);

1460000015148706?w=607&h=185

ps:需要注意的是执行bold命令,IE和Opera会使用标签包围文本,Safari和Chrome使用标签,而Firefox则使用''标签,由于各个浏览器实现命令的方式不同,加上通过innerHTML实现转化的方式也不一样,所以不能指望富文本编辑器会产生一致的HTML。

1460000015148707

1460000015148708?w=514&h=149

设置斜体 document.execCommand('italic', false, null)

1460000015148709

设置居中对齐document.execCommand('justifycenter', false, null);

1460000015148710?w=602&h=192

设置插入图片document.execCommand('insertimage', false, './position.png');

1460000015148711?w=603&h=217

设置字体大小document.execCommand('fontsize', false, this.value);

1460000015148712

当然,还有一些其他的设置命令,比如backcolor设置背景色,indent缩进文本,formatblock要包围当前文本块HTML标签,copy将选中文本复制到剪贴板等。

除了命令之外,还有于之相关的一些方法:

document.queryCommandEnabled()检测某个命令是否可以针对当前选择的文本。比如document.queryCommandEnabled('bold')返回true表示对当前选中的文本可以执行bold命令。

document.queryCommandState()确定是否已将指定命令应用到选择的文本。比如document.queryCommandState('bold')返回true表示当前选中的文本用了bold命令加粗的。

document.queryCommandValue()获取执行命令传入的值。比如document.queryCommandValue('fontsize')返回5,则用fontsize命令传入的值是5。

富文本选区

为了更精细化控制富文本编辑器的内容,可以使用document.getSelection()方法,返回Selection对象。在Selection对象上提供了很多实用的方法。

var selection = document.getSelection();

console.log('当前选中的文本:');

console.log(selection.toString());

// 取得代表选区的范围

var range = selection.getRangeAt(0);

console.log(range);

// 包裹一个标签使得选中内容突出

var span = document.createElement('span');

span.style.backgroundColor = '#f0f';

range.surroundContents(span);

console.log('当前文本编辑器内容:');

console.log($richedit.innerHTML);

1460000015148713

1460000015148714?w=703&h=198

总结

一般来说,为了便利性,安全性,避免重复造轮子,在实际工作中都是直接用一些开源组织编写的富文本编辑器,比如ueditor,umEditor,handEditor等,当然应用在一些场景也是需要自己理解和会写一部分功能,比如在线文档。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值