HTML5富文本API


自从创建这公众号,我朋友fmq就和我提到,每天写一篇文章,还要有内容原创,真的会很难。建议我按类型分别写,比如先来各个语言和C语言做下比较,再从头教一教C基础,然后一个一个语言、一个一个库类、一个一个项目写着走。

行吧,本上火就这样写(shui)了3天。我朋友又说到,光这样写意义不大,要我把我以前那堆坑补补,然后每周推一篇补坑的内容,就算实作中的干货吧。好吧,好吧,那本上火就每周星期天推一篇补坑的记录吧。

这时上火那朋友又说,他忍不了实验库里面那富文本编辑器了。也对,那东西临时放在网站发文章那里,应急一下也不是啥办法。那就这样吧,今天本上火就来重新用HTML5的富文本API,给这博客发文章页面重新做个富文本编辑器吧。至于实验库里面那编辑器,就扔回我实验库好了。


进入正题:


其实HTML5有这样一个富文本API是相当的鸡肋,如果说这个API有用,或许确实有用,大大的简化了我们开发网页富文本的工作量。如果说这个API没用,它又真的没用,说是HTML5,但API产生的内容却是HTML4.1的,甚至让人不禁怀疑这是HTML4.1的API。如果让这API实现个这API中另外的富文本需求,比如字体的大小换个单位,这API不能实现不说,还没有一个中间的方案,一旦要自行实现,必然要涉及与直接开发富文本相当的工作量。如此的话,这API的意义又何在?

虽然这个API对于要求高的富文本需求相当鸡肋,但是做个简单的富文本还是足够了。


首先为了我们使用这个API的函数更加方便,让我先重写个函数来给这个API的参数位置等微微调整一下。

这个execCommand函数一共有3个参数,而第二个参数在,我将实现的这个简单的富文本中,是恒定为“真”的,同时每次执行API后,我们都要把焦点回到富文本的编辑区。于是我写了这样一个函数:

函数 设置HTML编辑区(富文本API中要使用的命令,命令需要的额外参数)

   function setHtmlEdit (aCommandName, aValueArgument ){

    document .execCommand(aCommandName , true , aValueArgument);

    code.focus ();  //code元素是文本编辑区

   }

接着我们就可以尽情的调用这个API了,其实。。。自从用上这个API,上火就无时无刻不感觉自己在打酱油。


本来还想面向对象装波比,结果,算了算了,直接在html代码里面加onclick事件直接调用这函数即可。

本来今天忙了一天,晚上这两个小时本想休息一下,我那朋友还催我写文章,写简单点得了。因此,请不要骂这段代码烂,拜托拜托。

稍微麻烦点的就是要输入参数的API,我们先新建个变量,然后弹窗向用户请求参数,判断参数不为空,那么发给API即可。

var i  prompt ( "请输入要链接到的URL地址" "http:\/\/" ) //弹窗向用户要求输入一个链接地址

if(i && i !=  "" && i !=  "http://" ){ //带漏洞的判断链接地址不为空

 setHtmlEdit( "createLink" i );

}


这有个漏洞就是,如果用户输入不合法参数,那么,跳转到不知名的地方,或者注入代码攻击。不过因为这本来就在前端完成的内容,如果真要去玩这个漏洞,其实F12就足够了。等以后哪天真要讲这漏洞时再详细谈谈,一个一般用户接触不到的,无法危害到服务端任何内容的漏洞就先放一边了。

同理实现超链接和字体背景颜色。



至此,整个富文本API调用基本完成,这整个富文本API可以实现的基本功能大致如下表:

命令 功能 附加参数 备注
backColor 修改文档的背景颜色 一个color值
bold 粗体文字

contentReadOnly 文档内容的可编辑性
不建议使用
copy 复制选中内容

createLink 创建链接 一个URL a标签
cut 剪切选中内容

decreaseFontSize 给选中内容加上small标签

delete 删除选中部分

enableInlineTableEditing 启用或禁用表格编辑控件

enableObjectResizing 启用或禁用图像和其他对象编辑控件

fontName 设置选中文本字体
字体名
fontSize 设置选中文本字体大小

foreColor 设置选中文本字体颜色

formatBlock 添加一个HTML块式标签在选中行 一个HTML标签名 如H1,P等
forwardDelete 基本等同于按下键盘的Backspace键

heading 添加一个标题标签在选中处 一个HTML标签名 如H1,H6等
hiliteColor 设置选中范围背景颜色 一个color值
increaseFontSize 给选中内容加上big标签

indent 添加缩进

insertBrOnReturn 按下Enter键时插入情况控制
不建议使用
insertHorizontalRule 插入一个hr标签

insertHTML 插入一段HTML

insertImage 插入一个图片 一个指向图片的URL地址
insertOrderedList 插入一个有序列表

insertUnorderedList 插入一个无序列表

insertParagraph 插入一个段落

insertText 插入一段文本内容 内容
italic 给选中内容加上i标签

justifyCenter 文本居中

justifyFull 文本对齐

justifyLeft 文本左对齐

justifyRight 文本右对齐

outdent 减少缩进

paste 粘贴
需要配置,一般没法用
redo 重做被撤销的操作

removeFormat 清除格式

selectAll 全选

strikeThrough 给选中内容加上删除线

subscript 给选中内容加上下角标

superscript 给选中内容加上上角标

underline 给选中内容加上下划线

undo 撤销

unlink 给选中内容去除a标签
与createLink创建链接相反
useCSS 旧版的styleWithCSS
已废弃
styleWithCSS 切换使用HTML还是CSS标记富文本 一个布尔值 通常为避免生成富文本为HTML4.1,都需要开头时使用一次这个


在实现富文本后,我们再加一个源码的转换,以便直接粘贴HTML进富文本:

if( this.title== "源码" ){

this.title= "文本";

displayCode(true ); //使用本上火之前写的富文本与HTML互转函数,将富文本转换为HTML源码

}

else{

this.title= "源码";

displayCode(false ); //将源码转换为富文本

}



因为今晚时间有限,整个网站文章发布用的富文本就先做到这里,有空的时间再慢慢完善。之前其实上火有写过一个实验性的富文本编辑器,虽然支持的富文本编辑功能更多,但因为对浏览器的的兼容没处理好,那个富文本编辑器就先丢回我的实验库吧。先就这样了,各位晚安。2018-6-24,21:32