js聊天框插入表情

有同学对这块内容比较感兴趣,接下来简单介绍一下实现原理。
在之前输入框内插入表情都是通过在textarea插入特殊标识,如[smile],后来在页面渲染时替换成<img src="smile.gif">。那么如何在插入时就能看到所发送的表情呢?类似QQ。

效果先行


a.png
1.gif

1.conteneditable属性

传统textarea文本域不能解析标签,例如:

textarea.value+="<img src='smile.gif'>"
//输入框内仍然是<img src='smile.gif'>,不能解析标签

自然就不能使用textarea作为文本载体了,我们可是使用 conteneditable属性,它可以让你的div也具备输入功能

<div contenteditable="true"></div>

好,div可以输入内容了,并且插入的标签也可以解析;如果只是想在段落末尾加上表情,那你大可以这样去做:

div. innerHTML+="<img src='smile.gif'>"

但是,你是要成为海贼王的男人,怎么能满足于此?

2.getSelection(获取selection对象)

为什么要用它?有时候我们想在光标所在位置插入标情,那这个对象里就有可以让我获取位置的方法及属性;
Selection对象所对应的是用户所选择的 ranges (区域),俗称拖蓝。默认情况下,该函数只针对一个区域

在你的页面插入这段代码,当你点击的时候就会在页面弹出你所框选的内容了

document. onkeyup=function(){
       var word = window.getSelection?window.getSelection():document.selection.createRange().text;
       alert(word)
}

更细致的选取操作:

var sel = window.getSelection();
var range = sel.getRangeAt(0)//选择第一选区
var img = new Image();
range.collapse(false);//对于IE来说,参数不可省略
img.src="smile.gif"//创建图片节点
range.insertNode(node);//插入到该选区

这样去写的话会存在一些问题;当你框选内容的时候,不会替换内容,而是在所选内容之后插入,这是因为range.collapse()方法:

range.collapse();//(false 默认)到选区末端    true 开始位置
//当你框选内容的时候,执行该方法,可以让光标移动到选区结束位置,然后插入内容

所以,当框选的时候,正常做法应该是删除框选内容,然后插入新节点

range.deleteContents();//清除内容

优化上述代码:

var sel = window.getSelection();
var range = sel.getRangeAt(0)//选择第一选区
range.deleteContents();//清除选区内容
var img = new Image();
range.collapse(false);//对于IE来说,参数不可省略
img.src="smile.gif"//创建图片节点
range.insertNode(node);//插入到该选区

完整代码

function insertImg(src) {
    if (window.getSelection) {
        var sel = window.getSelection();
        var range = sel.getRangeAt(0);
        var img = new Image();
        range.deleteContents()
        img.src=src;
        range.insertNode(img);
        range.collapse(false);//对于IE来说,参数不可省略
    }
}
2.gif

IE怎么办?

function insertImg(src) {
    if (window.getSelection) {
        var sel = window.getSelection();
        var range = sel.getRangeAt(0);
        var img = new Image();
        range.deleteContents()
        img.src=src;
        range.insertNode(img);
        range.collapse(false);//对于IE来说,参数不可省略
    }else if ('selection' in document) {
        content.focus();
        var range = document.selection.createRange();
        range.pasteHTML('<img src="' + src + '"> ');//插入文本,则range.text="xxx"即可
        content.focus();//IE 11模拟的IE5~IE8无须这一步也能获得焦点
    } 
}
//content为我的输入框id

表情包去哪找?如果碰到这个问题,这篇文章就不要看了


4.gif

人生异常短暂

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

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,737评论 1 92
  • HTML标签解释大全 一、HTML标记 标签:!DOCTYPE 说明:指定了 HTML 文档遵循的文档类型定义(D...
    米塔塔阅读 3,229评论 1 41
  • 时间过的真快,又是周末了,早上吃饭的时候女儿问我:妈妈,这个周我们五个同学争取了放学后打扫卫生和排桌子,下午...
    崔嘉诺阅读 132评论 0 0
  • “你把我屏蔽了。” 六点钟闹钟响,迷迷糊糊看了眼手机闹钟,看到了你发的信息。 我本该是要谢谢你的,快两年了,你第一...
    讨说阅读 4,621评论 1 7
  • Chapter.1 如约而至 八月,广州,台风将至。 因为办理户口迁移的原因,我开始频繁的在白云区和天河区之间奔波...
    边度客栈阅读 378评论 0 2