web端实现富文本编辑器

  第一次查询这个问题时 是在开发一个小程序,想在小程序中实现一个类似简书的富文本编辑器。查了许多资料、问了许多人 最终都没能解决,只能做一个不算方便的编辑器

小程序文本编辑器

  这个编辑器也可以编辑文章 但是和正真的富文本编辑器还是有很大的差距,但由于小程序的限制又没有很好的解决方案。所以我开始向着网页端寻找

  网页端有不少的富文本编辑器插件 比如百度的UMeditor  及轻量化的Squire 功能都挺好用的 

百度UMeditor
Squire

接下来 说说原生js+css+html富文本编辑器的实现吧!

实现的方式有两种 一种是在iframe中实现 一种实在div中实现 个人感觉div中实现的要好一些

说说div中编辑器的实现吧 略略略

编辑器的实现主要时依赖元素的contenteditable属性 将元素变为可编辑状态 这样状态下的元素就像一个textarea 


不多说 先上git地址

https://github.com/Jy9/textRedact

这个demo只是实现了一个比较简单的文本编辑 

主要使用execCommand 的一些命令 来实现各种功能

首先添加一个div 将div contenteditable属性设置为true

<div contenteditable='true' data-text='在这里输入文本'></div>

data-text 是为了实现类似texteara中placeholder的效果配合css中

[contentEditable=true]:empty:not(:focus):before { content: attr(data-text); color: #eee; }

设置完成后就开始写js的代码 利用execCommand 改变输入时的状态

比如 加粗

document.execCommand("bold", false, null);

斜体

document.execCommand('italic',true,null)

...

然后再改变输入状态的同时 改变按钮的状态 方便随时知道开启的状态有哪些

$("#Strik").click(function() {

    //加粗

    document.execCommand("bold", false, null);        //设置字体的加粗状态

    if($("#Strik>img").attr("src") == "./icon/加粗.png"){        //更改加粗图标状态

        $("#Strik>img").attr("src","./icon/加粗@.png")

    }else{

        $("#Strik>img").attr("src","./icon/加粗.png")

    }

    $("#import").focus();          //在更改完状态后记得让光标保持在输入框内

});

这样一个简单的加粗功能就可以用了

功能有了 但是万一因为人为改变光标的位置了 怎么去监控现有的状态呢?

这里我用了getSelection().getRangeAt(0).endContainer.parentElement 获取到光标所在的元素

代码。。。。

$("#import").click(function(e){ // 设置最后光标对象

    var dom = $(getSelection().getRangeAt(0).endContainer.parentElement); //在点击输入框时获取光标所在的元素 并转换为jq对象

    clearStyle();    //将所有按钮的状态恢复到原始状态

    getStyle(dom)    //获取现在使用的状态 并将按钮状态矫正

})

在getStyle()中 利用递归 将所有状态找出来 并设置

function getStyle(dom){ 

    var tagName = dom.prop("tagName");

    if(tagName != "DIV"){ if(tagName=="I"){

        $("#Italic>img").attr("src","./icon/斜体@.png")

    }else if(tagName=="B"){

        $("#Strik>img").attr("src","./icon/加粗@.png")

    }else if(tagName=="U"){

        $("#Underline>img").attr("src","./icon/下划线@.png")

    }else if(tagName=="STRIKE"){

        $("#StrikeThrough>img").attr("src","./icon/删除线@.png")

    }

    getStyle(dom.parent());

    }

}

一个简单的所见即所得的富文本编辑就这样华丽丽的完成了  虽然有些简陋

另外 我在这个demo的添加图片时 用到了我的另一个插件 imageUpload 这个插件将input选择的图片转换成了file 和 base64 两种格式 方便上传及本地显示 

git : https://github.com/Jy9/imageUpload

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容